2011-11-01 13 views
7

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

答えて

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の実装でそれをしません memcache.Clientインスタンスの 'incr(self、key、delta = 1)メソッド サーバにC {key}の値をアトミックにインクリメントするようにコマンドを送ります。 C {delta}が指定されていない場合は1である。 戻り値C {key}がサーバ上に存在しない場合はNone、それ以外の場合は はインクリメント後に新しい値を返します。 C {key}の値は、すでにmemcacheに存在している必要があります。 であり、整数の文字列でなければなりません。 ' –

2

上記の他のコメントとは別に、デフォルトでは、casサポートはpython-memcachedクライアントで無効になっていることがわかりました。

client._cache.cache_cas = Trueの

を実際のcasコマンドを使用するには、CAS()を得るために:Djangoはコンストラクタに属性を追加する方法をサポートしていないので、私は追加する必要がありました。また、ソースのreset_casについてもお読みください:http://bazaar.launchpad.net/~python-memcached-team/python-memcached/trunk/view/head:/memcache.py

関連する問題