据我所知,Django的缓存功能在指定的时间间隔过后(例如1分钟,1小时等)过期,但我有一些内容每天都在变化(例如“当天的消息”)。理想情况下,这将被缓存24小时,但如果我将超时设置为24小时,则无法保证缓存将在午夜准确到期。处理这种情况的最佳做法是什么?
答案 0 :(得分:1)
两个简单的选项都会浮现在脑海中,两者都涉及需要在(比如)午夜运行的计划任务。
1)领先于游戏:安排一些代码运行(例如自定义管理命令),要求您提供当天的消息'午夜的内容,24小时到期。 (这假设尚未设置相关的缓存键)
2)Go nuclear:在午夜安排缓存清除
或者,将两者结合起来:
不要去核,只是安排一个电话只在午夜删除MOTD键(例如cache.delete(' motd_key'),然后再缓存新的。
或者,如果您使用Redis作为缓存后端,则可以缓存MOTD,然后进行EXPIREAT调用以将缓存的MOTD条目设置为在23:59:59到期。 redis.py会让你以Pythonic的方式做到这一点。
如果您使用Memcached作为后端,则无法获得该级别的控制权。
(如果您正在使用locmem://,那么你做错了; o))
答案 1 :(得分:1)
为什么不直接实现自定义缓存,而不是引入其他副作用,例如计划作业?
像这样创建一个缓存类:
from datetime import datetime, timedelta
from django.core.cache.backends.locmem import LocMemCache
class MidnightCacher(LocMemCache):
def __init__(self, name, params):
super().__init__(name, params)
def get_backend_timeout(self, timeout=None):
# return time until midnight
return (datetime.utcnow() + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0).timestamp()
在 settings.py 中配置缓存
CACHES = {
'midnight': {
'BACKEND': 'backend.midnight_cache.MidnightCacher',
'LOCATION': 'unique-snowflake',
}
}
最后,装饰您的视图:
@cache_page(1, cache="midnight")
def get_comething(request):
pass