Был некоторый беспорядок с тем, как я сформулировал вопрос.
Я закончил хэшем атрибутов для каждого класса. Возьмите этот класс, например:
class CachedModel(db.Model):
@classmethod
def cacheVersion(cls):
if not hasattr(cls, '__cacheVersion'):
props = cls.properties()
prop_keys = sorted(props.keys())
fn = lambda p: '%s:%s' % (p, str(props[p].model_class))
string = ','.join(map(fn, prop_keys))
cls.__cacheVersion = hashlib.md5(string).hexdigest()[0:10]
return cls.__cacheVersion
@classmethod
def cacheKey(cls, key):
return '%s-%s' % (cls.cacheVersion(), str(key))
Таким образом, когда сущности сохраняются в memcached, используя их cacheKey(...)
, они будут совместно использовать кеш, только если фактический класс такой же.
Это также имеет дополнительное преимущество, заключающееся в том, что отправка обновления, которое не изменяет модель, оставляет все записи в кэше для этой модели без изменений. Другими словами, отправка обновления больше не действует как очистка кэша.
Недостатком этого метода является хеширование класса один раз для каждого экземпляра веб-приложения.
ОБНОВЛЕНИЕ 2011-3-9: Я перешел на более сложный, но более точный способ получения версии. Оказывается, использование __dict__
дало неверные результаты, поскольку его представление str
включает адреса указателей. Этот новый подход учитывает только свойства хранилища данных.
ОБНОВЛЕНИЕ 2011-3-14: Таким образом, хэш python (...), очевидно, не гарантируется равным между запусками интерпретатора. Были странные случаи, когда другой экземпляр ядра приложения видел разные хэши. используя md5 (который быстрее чем sha1 быстрее чем sha256) сейчас. нет реальной необходимости быть криптобезопасным. просто нужен хороший hashfn. Вероятно, переключится на что-то более быстрое, но сейчас я скорее буду без ошибок. Также гарантируется сортировка ключей, а не объектов свойств.