我想要做的是将缓存中的某些值标记为相关,以便我可以立即删除它们。例如,当我向数据库插入一个新条目时,我想删除缓存中基于数据库中旧值的所有内容。
我总是可以使用cache.clear(),但这对我来说似乎太残酷了。或者我可以将相关值存储在字典中并缓存此字典。或者我可以在缓存中的额外字段中维护某种索引。但是一切似乎都很复杂(最终会变慢?)。
你怎么想?有没有现成的解决方案?或者我的方法是错的?谢谢你的回答。答案 0 :(得分:5)
您使用的是缓存API吗?听起来像。
This post,它指向these slides,帮助我创建了一个很好的世代缓存系统,让我创建了我想要的层次结构。
简而言之,您将生成密钥(例如group
)存储在缓存中,并将存储在密钥创建功能中的值合并,以便您可以一次使一整套密钥无效。
使用这个基本概念,您可以创建高度复杂的层次结构或只是一个简单的组系统。
例如:
class Cache(object):
def generate_cache_key(self, key, group=None):
"""
Generate a cache key relating them via an outside source (group)
Generates key such as 'group-1:KEY-your-key-here'
Note: consider this pseudo code and definitely incomplete code.
"""
key_fragments = [('key', key)]
if group:
key_fragments.append((group, cache.get(group, '1')))
combined_key = ":".join(['%s-%s' % (name, value) for name, value in key_fragments)
hashed_key = md5(combined_key).hexdigest()
return hashed_key
def increment_group(self, group):
"""
Invalidate an entire group
"""
cache.incr(group)
def set(self, key, value, group=None):
key = self.generate_cache_key(key, group)
cache.set(key, value)
def get(self, key, group=None):
key = self.generate_cache_key(key, group)
return cache.get(key)
# example
>>> cache = Cache()
>>> cache.set('key', 'value', 'somehow_related')
>>> cache.set('key2', 'value2', 'somehow_related')
>>> cache.increment_group('somehow_related')
>>> cache.get('key') # both invalidated
>>> cache.get('key2') # both invalidated
答案 1 :(得分:0)
缓存dict或序列化的东西(使用JSON等)对我来说听起来不错。缓存后端是像memcache这样的键值存储,它们不是分层的。