2009-05-21 1 views
10

Это специально связано с API-интерфейсом Memcache для Google App Engine, но я уверен, что он также относится к другим инструментам Memcache.Что делать, если я хочу сохранить значение None в memcache?

Словарь .get() метод позволяет указать значение по умолчанию, такие как dict.get («ключ», «») defaultval

Это может быть полезно, если это возможно, вы можете захотеть, чтобы сохранить None как значение в словаре.

Однако memcache.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, в первую очередь, но давайте, что в стороне Теперь. Есть ли лучший способ, с помощью которого я могу справиться с этим, помимо преобразования ников в строки и обратно?

ответ

7

Возможный способ сделать это - создать новый класс, который определяет для этой цели None, и назначить экземпляры этого кэша (к сожалению, вы не можете расширить None). В качестве альтернативы вы можете использовать пустую строку «» или избегать сохранения значений None/null в целом (отсутствие ключа означает None).

Затем проверьте экземпляры вашего класса 'None', когда вы проверяете результат mc.get(key) (is None, == "" и т.д.)

+0

Я думаю, что это лучший подход. Это дает вам дозорное значение, которое нельзя путать ни для чего другого. –

+0

Вот что я в итоге сделал. Благодаря! – jamtoday

0

Не совсем.

Вы можете сохранить значение None как пустую строку, но на самом деле нет способа хранить специальные данные в memcache.

В чем разница между ключом кеша, который не существует, и значением кеша является None? Вероятно, лучше объединить эти две ситуации.

+2

На самом деле, может быть полезно различать их. Например, предположим, что у меня есть (дорогой) способ аутентификации пользователей, и я кэширую результаты - данные пользователя - в memcache. Если я верну ответ «нет такого пользователя», я, вероятно, захочу кэшировать этот отрицательный ответ, иначе пользователь может выполнить DoS мою службу, пытаясь снова и снова входить в систему с неверными именами пользователей. –

+1

Это именно та ситуация, в которой я оказался. Иногда вы хотите знать, что функция вернула «Нет», но также и то, что она была сделана достаточно недавно, чтобы ее не удалось выполнить снова. – jamtoday

3

Вы можете сделать что-то вроде того, что делает Haskell и Scala, и хранить словарь Option. Словарь содержит два ключа: один ключ, указывающий, что он действителен, и один ключ, который используется для хранения данных. Что-то вроде этого:

{valid: true, data: whatyouwanttostore} 

Тогда если get возвращение Нет, вы не знаете, что кэш был пропущен; если результатом является словарь с None в качестве данных, вы знаете, что данные были в кеше, но что он был ложным.

Смежные вопросы