问题现象:
业务数据有错乱,A的一些数据有好几个都是B的数据
这些业务数据在保存在Redis缓存中,怀疑是并发情况下Jedis错乱的问题
原因分析:
- JedisUtil里面在使用完Jedis 后释放资源的方式不安全,会在有异常情况下没有释放干净,导致会被别的线程使用,从而导致别的线程使用了里面的数据
- Jedis的异常是因为 AWS做了线上维护把Redis做了主从切换,换成了b区的实例(node节点大部分在a区),导致Redis连接异常,从而引发了原因1
解决方案:
- 把不安全的释放shardedJedisPool.returnResource(jedis); 改成 jedis.close()
- 把Redis实例中的a区做为主实例区
思考:
这个还是可以通过静态代码检查尽早发现的,要重视@deprecated的告警提示,小问题点会引起线上大业务问题。 现在想着还后怕类似的问题