2009-05-21 7 views
10

これは特にGoogle App Engine Memcache APIに関連していますが、他のMemcacheツールにも当てはまります。MemcacheにNone値を保存する場合はどうすればよいですか?

辞書に.get()メソッドは、あなたが(「defaultval」「キー」、)などdict.getとして、デフォルト値を指定することができます

それが可能だあなたはどれを保存しないようにしたいかもしれない場合、これは便利です辞書の値として。

ただし、me​​mcache.get()ではこれを行うことはできません。それは次のようになりますので、私は私の@memoizeデコレータを変更した:

def memoize(keyformat, time=1000000): 

    """Decorator to memoize functions using memcache.""" 
    def decorator(fxn): 
     def wrapper(*args, **kwargs): 
      key = keyformat + str(args[1:]) + str(kwargs) 
      from google.appengine.api import memcache 
      data = memcache.get(key) 
      if Debug(): return fxn(*args, **kwargs) 
      if data: 
       if data is 'None': data = None 
       return data 
      data = fxn(*args, **kwargs) 
      if data is None: data = 'None' 
      memcache.set(key, data, time) 
      return data 
     return wrapper 
    return decorator 

今、私は私が最初の場所でなし値を格納すべきではない良いの引数があります確信している、しかし、のは、のために脇にそれを入れてみましょう今。 None valsを文字列に変換するだけでなく、これを処理するより良い方法はありますか?

答えて

7

この目的のためにNoneを定義する新しいクラスを作成し、このインスタンスをキャッシュに割り当てます(残念ながらNoneは拡張できません)。代わりに、空の文字列 ""を使用するか、None/null値をすべて格納しないようにすることができます(キーがない場合はNoneを意味します)。あなたはmc.get(key)is None== ""、など)の結果を確認するとき

はその後、本当にあなたの「なし」クラスのインスタンスのために

+0

これは最善のアプローチだと思います。それはあなたに何か他のもののために混乱させることができないセンチネルの価値を与えます。 –

+0

これは私がやったことです。ありがとう! – jamtoday

0

を未チェック。

空の文字列としてNone値を格納することはできますが、特別なデータをmemcacheに格納する方法はありません。

キャッシュキーが存在しないこととキャッシュ値が「なし」の違いは何ですか?これらの2つの状況を統一する方がよいでしょう。

+2

実際には、それらを区別すると便利です。たとえば、ユーザーを認証するための(高価な)方法があり、その結果(ユーザーの詳細)をmemcacheにキャッシュするとします。 「そのようなユーザーがいない」という返答が返ってきたら、その否定的な応答をキャッシュするか、無効なユーザー名で何度もログインしようとするとサービスがDoSできます。 –

+1

これはまさに私が自分自身で見つけた状況のタイプです。関数が 'None'を返したことを知りたければ、最近実行して、再度実行しないようにしています。 – jamtoday

3

あなたはHaskellとScalaのようなことを行い、Option辞書を格納することができます。辞書には、有効であることを示す1つのキーと、データを保持するために使用される1つのキーという2つのキーが含まれています。このような何か:

{valid: true, data: whatyouwanttostore} 

その後get戻りなし、あなたはキャッシュが失われたことを知っている場合。結果がNoneをデータとして持つ辞書の場合、データはキャッシュにあったものの、それは偽であることがわかります。

関連する問題