缓存穿透 (不经过缓存
例如不存在的数据,直接查数据库 称作穿透)
高并发查询一个没有缓存的数据(一种是数据库中不存在,另一种是数据库有但缓存没有)
,这样所有的请求都会去访问数据库查询数据。这样数据库就会导致突然的高并发。
解决方案:
对于不存在的数据也进行缓存
缓存雪崩(缓存数据大面积同时失效
,高并发请求全部直接查询数据库 称为雪崩)
采用相同的过期时间,导致数据同时失效,请求全部转发到数据库,数据库瞬间压力过大。
解决方案:
对于缓存的过期时间采用随机值
缓存击穿(热点数据失效
,那一时刻,高并发请求会直接请求数据库查询)
热点数据(某一个数据突然过期
)失效,突然的高并发请求查询,结果缓存过期了,导致请求直接去查数据库。
解决方案:
对数据库查询操作加锁
第一个请求,拿到锁后其它请求等一等,然后这个请求获得到数据后将结果做缓存。然后释放锁
第二个请求,拿到锁后,先查缓存有没有,有则从缓存拿,如果没有重复第一个请求的过程。
高并发加锁的逻辑
Redis分布式锁需要进行原子加锁和原子删锁
上图敲错了,是lua