缓存穿透 (不经过缓存例如不存在的数据,直接查数据库 称作穿透)

高并发查询一个没有缓存的数据(一种是数据库中不存在,另一种是数据库有但缓存没有),这样所有的请求都会去访问数据库查询数据。这样数据库就会导致突然的高并发。

解决方案:

对于不存在的数据也进行缓存


缓存雪崩(缓存数据大面积同时失效,高并发请求全部直接查询数据库 称为雪崩)

采用相同的过期时间,导致数据同时失效,请求全部转发到数据库,数据库瞬间压力过大。

解决方案:

对于缓存的过期时间采用随机值


缓存击穿(热点数据失效,那一时刻,高并发请求会直接请求数据库查询)

热点数据(某一个数据突然过期)失效,突然的高并发请求查询,结果缓存过期了,导致请求直接去查数据库。

解决方案:

对数据库查询操作加锁
第一个请求,拿到锁后其它请求等一等,然后这个请求获得到数据后将结果做缓存。然后释放锁
第二个请求,拿到锁后,先查缓存有没有,有则从缓存拿,如果没有重复第一个请求的过程。

高并发加锁的逻辑

缓存穿透、缓存雪崩、缓存击穿 概念_数据

Redis分布式锁需要进行原子加锁和原子删锁

缓存穿透、缓存雪崩、缓存击穿 概念_数据_02
上图敲错了,是lua
缓存穿透、缓存雪崩、缓存击穿 概念_缓存_03