文章目录
- 1.什么是缓存穿透,怎么解决
- 2.什么是缓存击穿,怎么解决
- 3.什么是缓存雪崩,怎么解决
- 4.双写一致性问题
- 5.redisson添加的排他锁是如何保证读写、读读互斥的
- 6.为什么不使用延迟双删
- 7.redis做为缓存,数据的持久化是怎么做的
- 8.redis的数据过期策略
- 9.redis的数据淘汰策略
1.什么是缓存穿透,怎么解决
缓存穿透:查询一个不存在的数据,MySQL查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库
解决方案一:缓存空数据
当查询到一个不存在的数据,返回缓存空数据,但是当数据真正有的时候,缓存中还是空数据,就会导致数据不一致
解决方案二:布隆过滤器
位图的思路:通过hash运算三次得到三个对应的值,如果三个值都为1即存在,如果其中一个不为1即不存在,存在一定的误判率,但完全可以接受
2.什么是缓存击穿,怎么解决
缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间吧DB压垮
解决方案一:互斥锁,强一致,性能差
解决方案二:逻辑过期,高可用,性能优,不能保证数据绝对一致
3.什么是缓存雪崩,怎么解决
缓存雪崩:同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力
解决方案:
● 给不同的key的TTL添加随机值
● 利用Redis集群提高服务的可用性
● 给缓存业务添加降级限流策略 降级可做为系统的保底策略,适用于穿透、击穿、雪崩
● 给业务添加多级缓存
4.双写一致性问题
采用redisson实现的读写锁,在读的时候添加共享锁,可以保证读读不互斥,读写互斥。当我们更新数据的时候,添加排他锁,它是读读,读写都互斥,这样就能保证在写数据的同时是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一锁才行。
注意:这种情况只有必须保证强一致性的时候才会使用
开发中大部分是允许短暂的不一致的,这个时候采用异步的方案
● 使用MQ中间件,更新数据之后,通知缓存删除
● 利用canal中间件,不需要修改业务代码,伪装为MySQL的一个从节点,canal通过读取binlog数据更新缓存
5.redisson添加的排他锁是如何保证读写、读读互斥的
排他锁底层使用也是setnx,保证了同时只能由一个线程操作锁住的方法
6.为什么不使用延迟双删
延迟双删,如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据,其中这个延时多久不太好确定,在演示的过程中可能会出现脏数据,并不能保证强一致性,所以没有采用
7.redis做为缓存,数据的持久化是怎么做的
有两种方式,一种是RDB,一种是AOF
RDB是一个快照文件,它是把 redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据
AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据
RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令
8.redis的数据过期策略
第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key
第二种是定期删除,每隔一段时间,我们就对一些Key进行检查,删除里面过期的key
定期清理的两种模式:
● SLOW模式是定时任务,执行频率默认是10HZ,每次不超过25MS,以通过修改配置文件redis.conf的HZ选项来调整这个次数
● FAST模式执行频率不固定,每次时间循环会尝试执行,但两次间隔不低于2ms,每次耗时不超过1ms
Redis的过期删除策略:惰性删除+定期删除两种策略进行配合使用
9.redis的数据淘汰策略
- Redis提供了8种不同的数据淘汰策略,默认是noeviction不删除任何数据,内存不足直接报错
- LRU:最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高
- LFU:最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高
平时开发过程种用的比较多的就是allkeys-lru,挑选最近最少使用的数据淘汰,把一些经常访问的key留在redis中
数据库有1000万数据,Redis只能缓存20W数据,如何保证Redis中的数据都是热点数据
回答:使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,那留下来的都是经常访问的热点数据