redis应用07:缓存穿透,缓存雪崩

缓存相关问题

缓存穿透,缓存雪崩,缓存预热,缓存算法,缓存降级

缓存算法:FIFO,LRU

缓存预热:事先把热点数据导入到缓存,并定期更新缓存中的热点数据;

缓存降级:应该该并发压力下,关掉非核心服务,节约资源服务于核心服务

分布式缓存:redis cluster就是分布式缓存,主从模式维护高可用;

数据库集群;

参考

https://juejin.im/post/5aa8d3d9f265da2392360a37

缓存穿透

导致缓存穿透的原因:
查询大量缓存和数据库中根本就不存在的数据。
无论是缓存穿透还是缓存雪崩,都会导致数据库瞬间面临巨大的压力,致使数据库崩溃。
数据库读写是io操作,io操作并发能力不高;

解决方案:
1.缓存空数据;

  1. BloomFilter:在请求缓存前过滤keys,没有的key不放行;
    bloomFilter可以避免有人攻击redis cluster,随机提交了大量的垃圾keys,浪费空间和资源;

缓存雪崩

导致缓存雪崩的原因:
1.热点数据集中失效
2.缓存服务器挂了

致使数据库瞬间压力剧增,导致数据库崩溃了;

解决方案;
1.加锁
2.设置不同的失效时间

高并发处理中缓存、降级、限流技术

https://blog.csdn.net/liujianwd/article/details/77482041
http://jinnianshilongnian.iteye.com/blog/2306477
降级:关掉非核心服务,节约资源给核心服务

学习锁,分布式锁,是为了解决数据库雪崩的问题的;

是为了控制并发量;数据库的io读写;

无论是缓存穿透,还是缓存雪崩, 最后都把压力落在了数据库的io读写上,
数据库面临短时内的超高并发,会雪崩的;

做了这些都是为了保护脆弱的数据库;

缓存穿透和缓存雪崩,都可以通过加锁的方式控制打到db上的并发量,

秒杀系统设计

https://segmentfault.com/a/1190000008888926

缓存穿透和缓存雪崩解决方案

https://blog.csdn.net/zeb_perfect/article/details/54135506
https://blog.csdn.net/wang0112233/article/details/79558612

缓存穿透,解决方法:

1、缓存层缓存空值。
–缓存太多空值,占用更多空间。(优化:给个空值过期时间)
–存储层更新代码了,缓存层还是空值。(优化:后台设置时主动删除空值,并缓存把值进去)

2、将数据库中所有的查询条件,放到布隆过滤器中。当一个查询请求来临的时候,先经过布隆过滤器进行检查,如果请求存在这个条件中,那么继续执行,如果不在,直接丢弃。

缓存雪崩(缓存失效)
如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。

    缓存层宕掉后,流量会像奔逃的野牛一样,打向后端存储

解决方法:

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存
不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。

你可能感兴趣的:(redis应用07:缓存穿透,缓存雪崩)