Related to this question.Django的內存緩存代碼審查:比較,並設置
我試圖實現使用Memcache’s compare and set在memcached的計數器增量。
有人可以查看此代碼潛在的漏洞?
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
此外,因爲我使用的是內部的memcached API無法通過Django的,這是否追加鍵前綴我在設置中設置通過。如果不是我可以如何追加這個內部API調用的密鑰?
'memcache': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'KEY_PREFIX': 'store_',
}
Guido解答了這個問題:http://neopythonic.blogspot.com/2011/08/compare-and-set-in-memcache.html。沒有設置值時incr不增加。現在,當您嘗試設置一個值時,就會出現競爭狀態。 CAS試圖解決這種競爭條件。 –
二進制協議'incr'允許您指定一個起始值。在此之前,你只需要做一個增加然後incr。 – Dustin
@Dustin Incr不會在python內存緩存實現中執行此操作 memcache.client實例的incr(self,key,delta = 1)方法 向服務器發送命令以原子方式遞增C {key}的值 C {delta},如果C {delta}未指定,則加1。 如果服務器上不存在C {密鑰},則返回None,否則在增量後 返回新值。 請注意,C {key}的值必須已經存在於內存緩存中, 並且它必須是整數的字符串表示形式。# –