[线上问题]redis从节点exists引起的问题
2020-07-27 本文已影响0人
程序员小鬼
【背景】
最近线上陆续有人报bug,关注列表中明明关注了用户,但是没有返回关注列表。经排查发现关注服务接口返回数据为空。关注方经排查发现redis在从库上使用exists做判断,已经失效的数据,仍然返回ture.虽然不知道关注业务方是什么样的业务逻辑。但是对于redis这个问题还是感兴趣。【Redis相关知识】
一般的在qps较高的业务上,我们习惯上采用读写分离来减小数据库的负载,Redis也可以这么做。
1、主从同步
2、过期键处理
①惰性删除
使用的时候再检查时候过期,过期才删除
②定时删除
主键过期,立马删除
③定期删除
设定一个周期,定期去扫描主键,删除过期主键
redis里面使用的惰性删除和定期删除
【疑问一】为什么在从库上exists会返回true
从库redis的数据完全依赖主库,不会发生修改操作,当对从库进行exists时,数据过期也不会向从库发送del message.因此返回结果为ture.解决办法就是使用ttl替代exists
【疑问二】用户反馈大半天时间,这个bug还是存在
定期删除策略按默认10秒扫描一遍,一次扫描1000个,半天也能扫描400多万。不至于bug时间持续半天,扒了一下代码,扫描策略不是顺序扫描。
image.png