我在Django中使用per-view cache,我希望在它变得陈旧时刷新缓存。在文档中,我没有看到有关刷新过时缓存的信息,在经过多个线程后,我决定使用django-signals向一个函数发送信号,该函数将从DB中删除缓存记录。所以我的问题是我们如何检索密钥并将其删除?
我看到默认实现提供了一种给缓存过期时间的方法(如在@cache_page(60 * 15)中,并且只要我们在到期时间之后调用视图就会刷新。有没有办法刷新过时的缓存在预定义的时间?
答案 0 :(得分:1)
我在这里找到了一些解决方案(Expire a view-cache in Django?)。它主要与memcached数据有关,但我的是数据库缓存数据。
我想出了Django信号来调用一个函数来清除与我的视图相关的所有缓存。由于在db缓存数据中检索键不是一件简单的事情,我只是传递原始SQL来删除视图缓存。下面是代码片段。
注意:由于我只有一个缓存视图,我只是删除它,但如果缓存表中有多个每个视图缓存,则在删除缓存数据时需要小心
cache_table是在settings.py
中为缓存表定义的名称CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'cache_table',
}}
@receiver(post_save, sender=SampleModel)
def remove_cache(instance, **kwargs):
with connection.cursor() as cursor:
cursor.execute("DELETE FROM cache_table where cache_key like ('%views.decorators.cache%')")
print('Deleted view cache')
答案 1 :(得分:0)
另一种方法是使用django low-level cache API创建自己的缓存并创建自己的密钥。这很容易,可以让您更好地控制缓存数据。