我在Redis中有一个特定的缓存系统。
这个系统的内容非常不稳定,值总是会被添加和删除。我希望尽可能多地将“用过的”密钥保留在内存中,同时让旧的密钥过期。每个请求可能需要来自缓存的数百个键。
我知道我可以设置一个“足够长”的过期时间,并且只处理Cache未命中,但我希望尽可能少的未命中。
目前我正在做这样的事情,当我写/读缓存时(伪代码)
# write
write(key, value)
expire(key, ttl)
# read
read(key)
expire(key, ttl)
我可以通过使用流水线来优化读取。
现在,这看起来仍然不是最好的方法。有人能给我一个更好的策略吗?
发布于 2013-11-05 14:20:05
如果您可以接受10秒的(当前)分辨率,那么OBJECT IDLETIME命令将让您更好地了解哪些内容有一段时间没有使用(以10秒为单位)
> SET X 10
OK
> OBJECT IDLETIME X
10
发布于 2018-06-09 04:35:27
我将创建一个脚本(https://redis.io/commands/script-load),它直接在服务器端以原子方式更快地完成此任务,然后在EvalSha (https://redis.io/commands/evalsha)中使用它。
这节省了每个命令的额外往返行程。
或者,你可以实现一个类似于Redis在空间不足时运行的LRU的算法(https://redis.io/topics/lru-cache) --每隔一段时间获取随机的密钥,如果它们对你来说太旧了,就把它们移除,或者循环直到你得到一个长序列的新密钥。
发布于 2013-11-06 22:13:28
如果你想实现的是一个完美的LRU缓存(最近最少使用),你可以在全球范围内调整Redis的行为,这里有一个关于Redis的链接,LRU:http://oldblog.antirez.com/post/redis-as-LRU-cache.html
请注意,它在redis上使用的是maxmemory属性,除非您查看易失性LRU:How to make Redis choose LRU eviction policy for only some of the keys?,否则驱逐规则是全局的。
您正在使用一个手动解决方案来清除自定义过期/ TTL,这是最强大的解决方案,但使用此解决方案可能会简化您的配置,并在内存大小方面具有更好的可预测性。
https://stackoverflow.com/questions/19766626
复制相似问题