Related to this question.Django Memcache Mã xét: So sánh và thiết
Tôi cố gắng để thực hiện một increment truy cập trong memcached sử dụng Memcache’s compare and set.
Ai đó có thể xem xét mã này cho sơ hở tiềm năng?
def increment(id):
client = get_cache('memcache')
i = 0
items = 0
while i <= 3:
counter = client._cache.gets(id)
if counter is not None:
items = client._cache.cas(id, counter+1)
if items:
break
else:
items = client._cache.add(id, 0)
if items:
break
i+= 1
return items
Ngoài ra kể từ khi tôi đang sử dụng một API memcached nội bộ không có sẵn thông qua Django, không này nối tiền tố then chốt tôi đặt qua trong cài đặt. Nếu không làm thế nào tôi có thể nối thêm khóa cho cuộc gọi API nội bộ này?
'memcache': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'KEY_PREFIX': 'store_',
}
Guido trả lời câu hỏi này: http://neopythonic.blogspot.com/2011/08/compare-and-set-in-memcache.html. incr không tăng khi không có giá trị nào được đặt. Bây giờ khi bạn cố gắng thiết lập một giá trị có một điều kiện chủng tộc. CAS cố gắng để giải quyết tình trạng cuộc đua đó. –
giao thức nhị phân 'incr' cho phép bạn chỉ định giá trị bắt đầu. Trước đó, bạn chỉ cần làm thêm sau đó incr. – Dustin
@Dustin Incr không thực hiện điều đó trong triển khai memcache python phương thức 'incr (self, key, delta = 1) của memcache.Client instance Gửi lệnh đến máy chủ để tăng giá trị nguyên tắc cho C {key} bởi C {delta} hoặc 1 nếu C {delta} không xác định. Trả về Không nếu C {key} không tồn tại trên máy chủ, nếu không thì sẽ trả về giá trị mới sau khi gia tăng. Lưu ý rằng giá trị cho C {key} phải tồn tại trong memcache, và nó phải là chuỗi đại diện của một số nguyên.' –