【发布时间】:2015-10-02 09:19:37
【问题描述】:
EDIT2:澄清:代码已经在未命中逻辑上有刷新缓存。我正在尝试做的是减少错过的缓存命中次数。
我使用 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']))
所以这正是我所要求的。
通常,这感觉太危险且无法控制。我可以想象很多不同的情况,在这些情况下这很快就会失败。
那么,有什么更好的解决方案?
【问题讨论】:
-
Keyspace 通知(如 Redis PubSub)不能保证会送达 - 例如,如果您的工作人员断开连接,您将丢失这些消息。我仍然建议您在代码中包含 refresh-catch-on-miss 逻辑。
-
就像我在其他地方所说的那样,我的代码已经有了 refresh-catch-on-miss 逻辑,而我正在努力避免错过。另外,它是一个缓存:如果通知丢失了,哦,好吧,我们不会刷新那个键,当它丢失时它会被刷新。但希望我们可以避免这种情况。