EDIT2:澄清:代码ALREADY在未命中逻辑上有刷新缓存。我正在尝试做的是减少错过的缓存命中数。
我正在使用Redis作为API的缓存。这个想法是,当API接收到一个调用时,它首先检查缓存,如果数据不在缓存中,API将获取它并在下一次缓存它。
目前配置如下:
maxmemory 50mb
maxmemory-policy allkeys-lru
也就是说,使用最多50mb内存,继续尝试按键,当内存已满时,删除最近最少使用的密钥(lru)。
现在我想介绍第二类密钥。对于第二类,我将设定一定的到期时间。现在我想建立一个机制,当这些密钥到期时,这个机制会启动并刷新它们(并设置新的到期时间)。
我该怎么做?
编辑: 一些进展。事实证明,Redis有一个发布/订阅消息系统,特别是可以在事件上发送消息。其中一个是过期密钥,可以这样启用:
notify-keyspace-events Ex
我发现此代码可以描述阻止python process subscribing to Redis' messaging system。可以轻松更改它以检测密钥过期,并在密钥到期时调用API,然后API将刷新密钥。
def work(self, item):
requests.get('http://apiurl/?q={param}'.format(param=item['data']))
所以这正是我所要求的。
通常,这种感觉太危险而且失控。我可以想象一些不同的情况,这种情况很快就会失败。
那么,什么是更好的解决方案?
答案 0 :(得分:0)
要使密钥过期,只需使用Redis'内置的到期机制。您不需要在到期时刷新缓存内容,最简单的方法是在代码遇到缓存未命中时执行此操作。
答案 1 :(得分:0)
http://redis.io/topics/notifications
Keyspace通知允许客户订阅发布/订阅频道 以某种方式接收影响Redis数据集的事件。 可以接收的事件示例如下:
所有密钥在数据库0中到期。(例如)
...
当过期设置为密钥时,EXPIRE会生成过期事件,或 每次设置过期结果到密钥时过期的事件 被删除(有关详细信息,请参阅EXPIRE文档)。