缓存击穿: 1,数据库访问压力瞬时增加。 2,redis并没有出现大量的key过期 3,redis还是正常的运行,压力并没有变大,还是平稳运行的
现象:redis某个key过期了,而恰巧有大量访问使用这个key 对于一些设置了过期时间的key呢,如果这些key可能会在某个时间点会高并发的访问,那么它是一种非常热点的数据,这个时候如果这个key,在大量请求进来的时候,正好失效,那么所有对这个key的数据查询,都会落到这个数据库上面,这个过程就叫缓存击穿。
key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题。
解决方案:
- 1,预先设置热门数据:在redis高峰之前,把一些热门数据提前存储到redis里面,加大这些热门数据key的时长。
- 2,现场监控,实时调整key时长
- 3,使用锁:(好处:不会发生缓存击穿)(坏处:效率低)
步骤: (1)就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db。 (2)先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX)去set一个mutex key (3)当操作返回成功时,再进行load db的操作,并回设缓存,最后删除mutex key; (4)当操作返回失败,证明有线程在load db,当前线程睡眠一段时间再重试整个get缓存的方法。
排它锁又称为写锁((eXclusive lock,简记为X锁)),若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。
通俗讲:
- 1,先去查询这个key
- 2,看这个key是否为null
- 3,如果这个key是null,则设置排它锁,
- 4,如果设置成功,则查询数据库,同步缓存,删除锁
- 5,如果失败,则证明有这个线程存在,等待线程结束,重新去查询key
|