Related to this question.ジャンゴMemcacheのコードレビュー:
を比較して、設定私は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を使用しておりますので、このは私が設定してから設定キー接頭辞を付加ありません。この内部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の実装でそれをしません memcache.Clientインスタンスの 'incr(self、key、delta = 1)メソッド サーバにC {key}の値をアトミックにインクリメントするようにコマンドを送ります。 C {delta}が指定されていない場合は1である。 戻り値C {key}がサーバ上に存在しない場合はNone、それ以外の場合は はインクリメント後に新しい値を返します。 C {key}の値は、すでにmemcacheに存在している必要があります。 であり、整数の文字列でなければなりません。 ' –