redis使用场景:缓存、分布式锁、计数器、保存token、消息队列、延迟队列
其中缓存有三兄弟经常会出现:穿透、击穿、雪崩
1.穿透:去查询一个不存在的key,mysql就不会存入缓存中,导致每次访问数据库。(
解决:1.查询不存在的key时,设置一个返回值null
2.加个布隆过滤器过滤,当查询时先经过布隆过滤器校验是否为空,为空就返回。
2.击穿:大量的去查一个过期的key,redis查不到就直接查库瞬间压垮数据库。(场景是热点数据)
解决:1.加互斥锁:专门拿一个线程来重查过期的key存入缓存,当查询缓存中没有这个key就获取互斥锁,其他线程就获取失败等待重试;等重新从数据库中查询到数据存入缓存中时释放锁。
2.逻辑过期:不设置过期时间,当访问过期数据时,逻辑和互斥锁一样拿一个线程重建数据库只是其他现在不要等待直接返回过期数据;等数据存入缓存就是最新数据。
3.雪崩:大量去访问过期的key,导致redis宕机来到数据库
解决:1.给不同key添加随机值
2.设立集群
3.业务限流降级
4.设置业务多级缓存