我有一个Django应用程序可以获得接近实时的数据(推文和投票),尽管更新平均每隔一两分钟就会发生一次。但是,我们希望通过更新站点和api结果来显示数据。
我们可能会在这个网站上看到大量的负载,所以我最初的想法当然是缓存!
让某种Memcached缓存被另一个进程或事件手动失效是否切实可行?换句话说,我会长时间缓存视图,然后有新的推文和投票使整个视图无效。
我并不关心只使一些对象失效,我考虑将MemcachedCache
后端子类化为this strategy之后添加一些功能。但当然,Django的会话也使用Memcached作为直写缓存,我不想让 无效。
答案 0 :(得分:6)
缓存失效可能是处理您尝试执行的操作的最佳方式。根据您的问题的措辞,我将假设您的应用程序如下:
假设上述两件事情都是真的,那么缓存失效肯定是要走的路。这是Django中最好的方法:
这基本上是Django signals的意思。在保存/更新对象后,它们将自动运行,这是使用最新信息更新缓存存储的好时机。
这样做意味着您永远不需要运行定期扫描数据库并更新缓存的后台作业 - 您的缓存将始终与最新数据保持同步。
答案 1 :(得分:4)
感谢@rdegges suggestions,我能够找到一个很好的方法来实现这一目标。
我遵循这个范例:
以下是您需要的所有代码:
from django.conf import settings
from django.core.cache import get_cache
from django.core.cache.backends.memcached import MemcachedCache
from django.utils.encoding import smart_str
from time import time
class NamespacedMemcachedCache(MemcachedCache):
def __init__(self, *args, **kwargs):
super(NamespacedMemcachedCache, self).__init__(*args, **kwargs)
self.cache = get_cache(getattr(settings, 'REGULAR_CACHE', 'regular'))
self.reset()
def reset(self):
namespace = str(time()).replace('.', '')
self.cache.set('namespaced_cache_namespace', namespace, 0)
# note that (very important) we are setting
# this in the non namespaced cache, not our cache.
# otherwise stuff would get crazy.
return namespace
def make_key(self, key, version=None):
"""Constructs the key used by all other methods. By default it
uses the key_func to generate a key (which, by default,
prepends the `key_prefix' and 'version'). An different key
function can be provided at the time of cache construction;
alternatively, you can subclass the cache backend to provide
custom key making behavior.
"""
if version is None:
version = self.version
namespace = self.cache.get('namespaced_cache_namespace')
if not namespace:
namespace = self.reset()
return ':'.join([self.key_prefix, str(version), namespace, smart_str(key)])
这可以通过在每个缓存条目上设置版本或命名空间,以及将该版本存储在缓存中来实现。版本只是调用reset()
时的当前纪元时间。
您必须使用settings.REGULAR_CACHE
指定备用非namspaced缓存,因此版本号可以存储在非命名空间缓存中(因此它不会递归!)。
每当您添加一堆数据并希望清除缓存时(假设您已将this设置为default
缓存),只需执行以下操作:
from django.core.cache import cache
cache.clear()
您可以使用以下方式访问任何缓存:
from django.core.cache import get_cache
some_cache = get_cache('some_cache_key')
最后,我建议您不要将会话放在此缓存中。您可以使用此方法更改会话的缓存键。 (作为settings.SESSION_CACHE_ALIAS
)。