未经同意定期刷新 Redis 缓存

Redis cache is flushed periodically without consent

我在设置用于存储序列化 Java 对象(平均 ~30k 大小)的 Redis 缓存时遇到问题 我们只是更改了实现,以便所有缓存对象都没有过期时间 (ttl == -1)

然后我把 redis.conf 改成这样

set maxmemory-policy allkeys-lru (was volatile-ttl)
set maxmemory-samples 7 (was 3=default)
set maxmemory 1gb (was 300mb)

我们制定了以下 'save' 规则

save 900 1
save 300 10
save 60 10000

问题是每当保存 1000-8000 个键时,整个缓存都会刷新为 0,重新开始。

我找不到这个的来源,我试过了

redis-cli monitor | grep "DEL"

但它显示没有发出大量删除 我也试过

redis-cli monitor | grep flush

但这几分钟没有任何输出。 我尝试在增加 maxmemory-setting 后重新启动 redis 服务(虽然我不应该这样做),但这也没有显示行为发生变化。

有人以前见过这样的东西吗? 注意:我们使用的是 Redis 2.8 - 如果以后的版本有补丁,我愿意升级 如果您需要更多详细信息来缩小问题范围,请告诉我。

谢谢!

问题最终是用户错误。 在我们的客户端代码中,程序正在调用 redis.del(keyname) 和随后的 redis.flushDB(),这是程序员在不知不觉中添加的,试图将更改推送到数据库。

如果我稍微改进一下 grep,我会更快地发现问题:

redis-cli monitor | grep -i flush