redis缓存并发操作可能存在的数据正确性问题

其实我想说的意思就是上图时间线表明的问题,即便是A线程使用双删除,但是在高并发情况下是否存在其他线程在线程B存入旧数据(就是M=400)到A线程再次删除这个时间段内有其他线程读取M,然后拿脏数据的M做判断去进行后续操作呢?
假如这种情况是存在的,我的解决方案是定义一个public static final Map redisKeyMap = Maps.newHashMap();然后把放入redis的键全部放入这个集合,每次操作缓存时对相应的key加锁(不是说只要操作缓存就加锁),即synchronized (redisKeyMap.get(key1)){},保证A线程操作指令的一个原子性,以及A、B线程之间的顺序性,即下图所示:

备注:关于评论区老哥说的这时候D、E、F线程也读取不了缓存的情况,其实我们可以把线程B加锁的时间点放在读缓存后(其他线程也是如此),查询数据库前来减轻锁的重度,是否就可以了?

本文地址:https://blog.csdn.net/qq_39743373/article/details/107151271

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐