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