3

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

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

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

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

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

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

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

现在这似乎仍然不是最好的方法。有人可以给我一个更好的策略吗?

4

3 回答 3

3

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

> SET X 10
OK
> OBJECT IDLETIME X
10
于 2013-11-05T06:20:04.833 回答
1

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

这节省了每个命令的额外往返行程。

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

于 2018-06-08T20:35:27.210 回答
0

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

请注意,它在 redis 上使用 maxmemory 属性,并且驱逐规则是全局的,除非您查看 volatile LRU:如何让 Redis 仅为某些键选择 LRU 驱逐策略?

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

于 2013-11-06T14:13:28.390 回答