其实我想说的意思就是上图时间线表明的问题,即便是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
如对本文有疑问, 点击进行留言回复!!
厉害!俩月吃透阿里P8架构师推荐608页kafka源码,成功入职蚂蚁
性能 1.84 倍于 Ceph!网易数帆开源分布式存储系统 Curve
荐 面试半年,上个月成功拿到阿里P7offer,全靠我啃烂了这份2020最新面试题!
高并发高可用复杂系统中的缓存架构(十五) 缓存架构讲解,如何保证缓存数据库一致性
网友评论