1.redis使用场景
缓存: 缓存三兄弟 穿透 击穿 雪崩 双协一致 持久化 数据过期策略 数据过期策略
分布式锁: setnx redisson
消息队列 延迟队列 何种数据类型
2.缓存击穿
缓存穿透:通过查询一个不存在的数据,数据库查询不到数据也不会写入缓存,导致每次都直接查数据库
解决方法一 :缓存空数据,查询返回的数据为空,仍贾昂这个空结果进行缓存
优点:简单
缺点:消耗内存,可能发送不一致问题(一开始 id为 10000 可能数据库中没有,然后缓存了空。后面数据库添加了这个数据 就导致缓存和数据库不一致)
解决方法二:布隆过滤器
根据id查询数据 查询布隆过滤器 布隆过滤器 预热缓存时,预热布隆过滤器 redis查询不到查询数据库
不存在 直接返回 布隆过滤器存在,返回redis
bitmap(位图)二进制数组
布隆过滤器 :检索一个元素是否在一个集合追踪
存储数据,通过多个hash函数,获取hash值,将其hash数改为1
优点:内存占用较小,没有多余的key
缺点:实现复杂,存在误判 要求95%以上正确率
3.缓存穿透
缓存击穿:某一个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求过来,这些并发请求可能压倒数据库
解决方法一:互斥锁
线程一: 1查询缓存未命中 2获取互斥锁成功 3查询数据库重建缓存数据
线程二: 1查询缓存未命中 2获取互斥锁失败 3重试 4重试 5缓存命中
优点:强一致
缺点:性能差
解决方法二:逻辑过期 (不设置过期时间)
在数据库中添加一个字段 过期时间
线程一: 1查询缓存 发现逻辑过期 已过期 2获取互斥锁成功 3开始一个新的线程去 重构缓存 4返回过期数据
线程二: 1 查询数据库重建缓存数据 2写入缓存 重置逻辑过期时间 3 释放锁
进程三: 1查询缓存 发现逻辑过期 已过期 2获取互斥锁成功 3返回过期数据
优点:高可用 性能优
缺点:无法做到强一致
4.缓存雪崩
缓存雪崩:同一时间大量的缓存key同时失效或者redis服务宕机,导致大量请求来到数据库,带来巨大压力
解决方案一:给不同的key的ttl添加随机值
解决方案二:利用redis集群提高服务的可用性 例如 哨兵模式 集群模式
解决方案三:给缓存业务增加 降级限流的策略 在springboot中 使用ngxin springcloud中 使用gateway网关进行配置
解决方案四:给业务添加多级缓存 Guava或者Caffeine 一级缓存 redis 二级缓存