Django中的分层缓存
我想做的是将缓存中的一些值标记为相关值,以便立即删除它们。例如,当我向数据库插入一个新条目时,我想删除缓存中基于数据库中旧值的所有内容 我总是可以使用cache.clear(),但这对我来说太残酷了。或者我可以将相关值一起存储在字典中并缓存此字典。或者我可以在缓存中的一个额外字段中维护某种索引。但对我来说,一切似乎都很复杂(最终慢了?)Django中的分层缓存,django,caching,Django,Caching,我想做的是将缓存中的一些值标记为相关值,以便立即删除它们。例如,当我向数据库插入一个新条目时,我想删除缓存中基于数据库中旧值的所有内容 我总是可以使用cache.clear(),但这对我来说太残酷了。或者我可以将相关值一起存储在字典中并缓存此字典。或者我可以在缓存中的一个额外字段中维护某种索引。但对我来说,一切似乎都很复杂(最终慢了?) 你怎么想?是否存在任何现有的解决方案?还是我的方法错了?谢谢您的回答。缓存dict或序列化的东西(使用JSON或类似的东西)听起来不错。缓存后端是像memcac
你怎么想?是否存在任何现有的解决方案?还是我的方法错了?谢谢您的回答。缓存dict或序列化的东西(使用JSON或类似的东西)听起来不错。缓存后端是像memcache一样的键值存储,它们不是分层的。您使用的是缓存api吗?听起来像 ,它帮助我创建了一个很好的分代缓存系统,让我可以创建我想要的层次结构 简而言之,您可以在缓存中存储一个生成密钥(例如
组
),并将存储的值合并到密钥创建函数中,以便一次使整个密钥集无效
有了这个基本概念,您可以创建高度复杂的层次结构或只是一个简单的组系统
例如:
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
嗯,这听起来对我来说也不错,但想象一下这样一种情况,例如,我会在HTML中缓存50页。加载/存储其中的每一页意味着首先加载所有50页。缓存有那么快和无限处理吗?好的,不是那种情况。还有另一种方法:让页面的缓存键依赖于几个页面特定的变量。这些变量可以在数据库中,并且可以在短时间内缓存。页面流失率应该很低,您可以让带有旧密钥的页面在较长时间内过期。感谢您的想法,这非常有趣。但我可能会在下一个答案中使用更适合我需要的解决方案。无论如何,我的建议与Yuji的答案基本相同。旧值被删除,请参阅关于过期的文档(默认值为5分钟)。哇,这太聪明了!我想旧值没有被实际删除并不是问题…?我指向上面的幻灯片只是说memcached在内存耗尽时首先清除最旧的键。我不确定移除这些钥匙和防止旧的但好的钥匙先走的现实世界的改进是什么。我将优化最后一个..这将在缓存中存储组的当前版本号。我认为如果缓存按照上次get或set操作的时间进行刷新,那么这可以正常工作,但是如果它使用其他方法,是否可能刷新组的当前版本,使其重置为1,并且可以从缓存中获取过时数据?