1Redis的缓存穿透与雪崩
什么是缓存穿透
就是一个不存在的数据,由于缓存不命中时,需要从数据库查询,查不到数据则写不入缓存,这将导致一个不存在的数据,每次请求都要到数据库去查询,造成缓存穿透
缓存穿透的解决方案:
可以把缓存为null对象,将null变成一个值
就是把一个不存在的数据设为null,然后给他设置一个有效时间,时间要短一点,最长不能超过五分钟,让他自动剔除
2布隆过滤器
布隆过滤器的原理,当一个元素被加入集合时通过K个散列函数将这个元素映射成一个数组的k点把他们置为1.在检索的时候看这些点的值,只要值为0就放过,当然为1就拦截。如果都是1就说明被检索元素很可能在。
bllom filter之所以 时间跟空间效率高,是因为牺牲了判断的准确率,与删除的便利性。
**
布隆的缺点
1,存在误判:因为他放弃了准确率,所以有时候他的hash得到的都是1,所以他会另外创建一个白名单来存储可能会被误判的元素。
2,删除比较困难。一个放到容器的元素映射到bit数组的k个位置是1,删除的时候不能简单的置为0,可能会影响其他元素的误判。可以采用couting bloom filter.
缓存雪崩与预防
缓存击穿:
是指缓存中没有,但是数据库有的数(一般这种情况会发生在缓存时间到期),这时由于并发用户特别多,同时读缓存没有读到数据,有同时去数据库取数据,引起数据库的压力瞬间增大,造成过大损失。
缓存雪崩:
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量过大引起数据库的压力过大甚至宕机。与缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据查不到,从而去查数据库。
阿么解决方案的话:
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
如果缓存数据库是分布式部署,将热点数据均匀分布在不同得缓存数据库中。
设置热点数据永远不过期。
多缓存结合(使用redis做分布式缓存,memaahe做单节点缓存)
使用第三方redis例如阿里云或者腾讯云
以上全部都是个人理解不喜勿喷,我还在努力的学习
**