美文网首页
踩坑记之redis ttl=0

踩坑记之redis ttl=0

作者: 顺风cysp | 来源:发表于2018-12-15 14:24 被阅读0次

    最近往服务的消息推送上加了一个分布式的锁,用来防止短时间内相同消息重复处理的情况,思路是用redis的setnx 设置一个key(key值根据业务制定,需要唯一),然后设置key的超时时间为5分钟,用于防止系统异常时没有主动释放锁的防御,在线上灰度环境试运行后,发现两个问题,一个是程序没有主动释放锁,另一个是redis没有删除超时过期的key,导致key值一直存在,后续的操作一直被排斥。

    经调查发现,第一个问题,程序没有主动释放key值,是因为key值有一部分引用了业务消息的状态,即格式为:systemA-cluster-lock-业务id-status-action,其中status在处理前后发生了变化导致没能删除原来的key,做法是通过copy多一份key值保留;

    第二个问题:redis没有删除超时过期的key,通过ttl key命令查看,return 0,通过查看官方文档https://redis.io/commands/ttl,redis的ttl返回的是剩余过期时间,当key不存在时返回-2,即没有返回0的情况。继续折腾,终于在https://blog.csdn.net/alexhendar/article/details/50857176 这边博客中找到了答案,原来和redis的配置有关,当redis为slave且read_only关闭时,redis不会删除过期的key值,此时ttl key返回0,通过查看redis配置,果然如此,于是修改redis配置,第二个问题得解。


    相关文章

      网友评论

          本文标题:踩坑记之redis ttl=0

          本文链接:https://www.haomeiwen.com/subject/jafahqtx.html