多亏了@rdegges的建议,我能够找到一个很好的方法来实现这个。
我遵循这种模式:
- 将渲染的模板片段和API调用缓存五分钟(或更长时间)
- 每次添加新数据时使缓存失效。
- 仅使缓存失效比在保存时重新缓存更好,因为当没有找到缓存数据时,新的缓存数据会自动、有机地生成。
- 在进行完整更新后(例如从推特搜索),手动使缓存失效,而不是在每个对象保存时。
- 这样做的好处是缓存失效的次数较少,但缺点是不够自动化。
以下是实现此方式所需的所有代码:
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)
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
指定您的备用非命名空间缓存,以便版本号可以存储在非命名空间缓存中(这样就不会递归!)。
每当您添加一堆数据并想要清除缓存(假设您已将
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
)。