我在设置用于存储序列化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 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

关于java - Redis缓存会在未经同意的情况下定期刷新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30916842/

10-11 22:56
查看更多