认识缓存
缓存更新策略
缓存穿透
缓存击穿
缓存雪崩
认识缓存
缓存的作用
1,降低后端负载 2,提高服务于相应速度
缓存的成本
1.开发成本 2,运维成本 3,一致性成本
缓存更新策略
三种策略
1,内存淘汰:redis自带的缓存淘汰机制
2,过期淘汰:利用expire命令给数据设置过期时间
3,主动更新:主动完成数据库与缓存的同时更新
策略选择
低一致性需求:选择内存淘汰或过期淘汰
高一致性需求:主动更新
缓存穿透
产生原因
客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远都不会生效,请求都会打到数据库
解决方案
1,缓存空对象
思路:对于不存在的数据也在redis建立缓存,值为空,并设置一个较短的TTL时间
优点:实现简单,维护方便
缺点:额外的内存消耗,短期的数据不一致问题
2,布隆过滤
思路:利用布隆过滤算法,在请求进入redis之前先判断是否存在,如果不存在直接拒绝请求
优点:内存占用少
缺点:实现复杂,存在误判的可能性
3,其他
做好数据的基础格式校验,加强用户权限校验,做好热点参数的限流
缓存雪崩
产生原因:在同一时段大量的缓存key同时失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力
解决方案:
给不同的key添加随机的TTL,
利用redis集群提高可用性,
给缓存业务添加降级限流策略,
给业务添加多级缓存。
缓存击穿
产生原因:
热点key :1,在某一段时间高并发访问 2,缓存重建时间较长
热点key突然过期,因为重建时间较长,导致在这段时间内大量请求到达数据库,带来巨大冲击
解决方案:
1,互斥锁
思路:给缓存重建过程加锁,确保重建过程只有一个线程执行,其他线程等待
优点:实现简单,没有额外内存消耗,一直性好
缺点:等待导致性能下降,有死锁风险
2,逻辑过期
思路:热点key缓存永不过期,而是设置一个逻辑过期时间,查询到热点数据是对逻辑过期时间进行判断,来决定是否需要缓存重建
重建缓存也通过互斥锁保证单线程执行
重建利用独立线程异步执行,其他线程无需等待,直接查询到旧的数据即可
优点:线程无需等待,性能较好
缺点:不保证一致性,有额外内存消耗,实现复杂
标签:缓存,过期,redis,Redis,线程,内存,key From: https://www.cnblogs.com/tyleaf/p/16874984.html