使用场景
缓存穿透:
原因(查询一个空数据,mydql查询不到数据,也不会直接写入缓存,导致每次都访问数据库,可能会宕机)
1.缓存空数据,但是内存消耗高
2.布隆过滤器,使用哈希算法里面存二进制,0和1,初始都为0,但是会有误判,数组越大 误判率会降低,数据不存在直接拦截,存在查询则查redis
缓存击穿:
一个热点key设置过期时间,恰好这个时间,有大量用户访问进来,导致这些并发请求可能会把数据库瞬间压垮
解决方法:
1.互斥锁
2.逻辑过期
缓存雪崩:
同一个时段,有多个key同时过期,或者redis服务宕机,导致大量请求访问数据库
解决方法:
1.设置ttl添加随机值
2.利用redis集群,提高高可用性,比如哨兵模式,集群模式
3.给业务添加多级缓存
4.给缓存业务添加降级限流策略
双写一致
1.先修改数据库,在删除缓存
2.延迟双删,降低脏数据,主从分离,所以要延迟
3.互斥锁
缓存读多写少,读写锁
所以有共享锁,排他锁**(可以保持强一致 但是性能方面不高)**
共享锁,允许其他线程读取数据,但不允许写
排他锁,拒绝其他现成读跟写
mq异步通知