如果正在使用redis,如何保持密钥,如果没有则过期?

时间:2013-11-04 11:18:43

标签: caching redis

我在Redis中有一个特定的缓存系统。

此系统的内容非常不稳定,值会一直添加和删除。我想尽可能地将“使用过的”密钥保存在内存中,同时让旧的密钥到期。 每个请求都需要缓存中的数百个密钥。

我知道我可以设置一个“足够长”的过期时间,并且只处理了Cache未命中,但我希望尽可能少地失误。

目前我正在做这样的事情,当我正在写/读取缓存(伪代码)

# write
write(key, value)
expire(key, ttl)

# read
read(key)
expire(key, ttl)

我可以使用流水线优化读取。

现在看起来这仍然不是最佳方式。 有人可以给我一个更好的策略吗?

3 个答案:

答案 0 :(得分:1)

如果您可以使用10秒的(当前)分辨率,那么OBJECT IDLETIME命令可以让您更好地了解一段时间内未使用的内容(以10秒为单位)

> SET X 10
OK
> OBJECT IDLETIME X
10

答案 1 :(得分:0)

如果您要实现的是一个完美的LRU缓存(最近最少使用),您可以将Redis调整为全局行为,这里是一个关于Redis作为LRU的链接: http://oldblog.antirez.com/post/redis-as-LRU-cache.html

请注意,它在redis上使用maxmemory属性,并且驱逐规则是全局的,除非您查看volatile LRU:How to make Redis choose LRU eviction policy for only some of the keys?

您正在使用自定义过期/ TTL进行驱逐的手动解决方案,这是最强大的解决方案,但您可以通过此解决方案简化配置并在内存大小中拥有更好的可预测缓存。

答案 2 :(得分:0)

我会创建一个脚本(https://redis.io/commands/script-load),直接在服务器端以原子方式更快地执行此操作,然后将其与EvalSha(https://redis.io/commands/evalsha)一起使用。

这可以节省每个命令的额外往返。

或者,你可以实现类似于Redis在空间不足时运行的LRU缓存的算法(https://redis.io/topics/lru-cache) - 每隔一段时间获取一次随机密钥并删除它们如果它们是'对你来说太老了,可选择循环,直到得到一长串新密钥。