Dav*_*ave 7 django memcached caching
我有一个Django应用程序可以获得接近实时的数据(推文和投票),尽管更新平均每隔一两分钟就会发生一次.但是,我们希望通过更新站点和api结果来显示数据.
我们可能会在这个网站上看到大量的负载,所以我最初的想法当然是缓存!
使某种Memcached缓存被另一个进程或事件手动失效是否切实可行?换句话说,我会长时间缓存视图,然后有新的推文和投票使整个视图无效.
我并不担心只使一些对象失效,我考虑将后MemcachedCache端子类化为按照此策略添加一些功能.但当然,Django的会话也使用Memcached的通过高速缓存写入,我不想无效说.
缓存失效可能是处理您尝试执行的操作的最佳方法.根据您的问题的措辞,我将假设您的应用程序如下:
假设上述两件事情都是真的,那么缓存失效肯定是要走的路.这是Django中最好的方法:
这基本上是Django信号的意思.在保存/更新对象后,它们将自动运行,这是使用最新信息更新缓存存储的好时机.
这样做意味着您永远不需要运行定期扫描数据库并更新缓存的后台作业 - 您的缓存将始终使用最新数据立即更新.
感谢@rdegges 的建议,我找到了一个很好的方法来做到这一点。
我遵循这个范式:
以下是您执行此操作所需的所有代码:
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)])
Run Code Online (Sandbox Code Playgroud)
这是通过在每个缓存条目上设置版本或命名空间并将该版本存储在缓存中来实现的。版本只是reset()调用时的当前纪元时间。
您必须使用 指定备用非命名空间缓存settings.REGULAR_CACHE,以便版本号可以存储在非命名空间缓存中(因此它不会递归!)。
每当您添加一堆数据并想要清除缓存(假设您已将其设置为default缓存)时,只需执行以下操作:
from django.core.cache import cache
cache.clear()
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式访问任何缓存:
from django.core.cache import get_cache
some_cache = get_cache('some_cache_key')
Run Code Online (Sandbox Code Playgroud)
最后,我建议您不要将会话放入此缓存中。您可以使用此方法更改会话的缓存密钥。(作为settings.SESSION_CACHE_ALIAS)。
| 归档时间: |
|
| 查看次数: |
3278 次 |
| 最近记录: |