2011-11-01 26 views
7

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_', 
} 

回答

4

我真的不直接回答你的問題,但我不禁要問,爲什麼你不只是使用incr()方法原子遞增值 - 這就是它是。也許你只是舉了一個例子,但如果是這樣的話,那麼這是一個誤導性的問題。

+0

Guido解答了這個問題:http://neopythonic.blogspot.com/2011/08/compare-and-set-in-memcache.html。沒有設置值時incr不增加。現在,當您嘗試設置一個值時,就會出現競爭狀態。 CAS試圖解決這種競爭條件。 –

+0

二進制協議'incr'允許您指定一個起始值。在此之前,你只需要做一個增加然後incr。 – Dustin

+0

@Dustin Incr不會在python內存緩存實現中執行此操作 memcache.client實例的incr(self,key,delta = 1)方法 向服務器發送命令以原子方式遞增C {key}的值 C {delta},如果C {delta}未指定,則加1。 如果服務器上不存在C {密鑰},則返回None,否則在增量後 返回新值。 請注意,C {key}的值必須已經存在於內存緩存中, 並且它必須是整數的字符串表示形式。# –