问题一:项目中哪些场景使用了redis呢?
1 缓存穿透
缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库。
1.1 解决方案一
方案一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存;{key:1,value:null}
优点:简单;
缺点:消耗内存,可能会发生不一致的问题,可能key为1的数据数据库已经有了,但缓存中仍为null
1.2 解决方案二
方案二:布隆过滤器
注:缓存预热时,预热布隆过滤器的意思是,热点数据加载到缓存的时候,也往布隆过滤器加载,但并不是全部添加。
优点:内存占用较少,没有多余key;
缺点:实现复杂,存在误判
1.2.1 布隆过滤器
bitmap(位图):相当于一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1。
布隆过滤器作用:布隆过滤器可以用于检索一个元素是否在一个集合中。
可能存在误判,例如:
总结:
1)Redis的使用场景
- 根据自己简历上的业务进行回答;
- 缓存,则会引出被提问 穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略
- 分布式锁 setnx、redisson
2)什么是缓存穿透,怎么解决
- 缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库;
- 解决方案一:缓存空数据;
- 解决方案二:布隆过滤器;
面试文稿:
问:什么是缓存穿透?怎么解决?
答:嗯~~,我想一下,缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到则不写入缓存,这将导致这个不存在的数据每次请求都要到DB去查询,可能导致DB挂掉。这种情况大概率是遭到了攻击。
解决方案的话,我们通常都会用布隆过滤器来解决它
问:好的,你能介绍一下布隆过滤器嘛?
答:嗯,是这样~,布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是redisson实现的布隆过滤器。它的底层主要是先去初始一个比较大数组,里面存放的二进制0或1,在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。查找的过程也是一样的。
当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%,当然这个误判是必然存在的,要不就得增加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。
标签:02,缓存,误判,Redis,布隆,穿透,过滤器,数据 From: https://www.cnblogs.com/daytoy105/p/17971877