1.redis的使用场景
1.1缓存
缓存三兄弟(穿透、击穿、雪崩) 、双写一致、持久化、数据过期策略,数据淘汰策略缓
缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库
解决方案
1、设置不存在的数据为null
2、添加布隆过滤器,缓存预热时,预热就加在到缓存中
解决布隆过滤器误判,设置误判率
缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮
解决方案:
1、互斥锁
2、逻辑过期(不设置过期时间)
缓存雪崩:是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力
解决方案:
给不同的Key的TTL添加随机值
利用Redis集群提高服务的可用性 哨兵模式、集群模式
给业务添加多级缓存 Guava或Caffeine
给缓存业务添加降级限流策略 ngxin或spring cloud gateway
redis做为缓存,mysql的数据如何与redis进行同步呢? (双写一致性)
强一致性:延迟双删、读写锁
最终一致性:异步通知,canal(代码0侵入)
redis做为缓存,数据的持久化是怎么做的?
在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF
假如redis的key过期之后,会立即删除吗?(数据过期策略)
Redis对数据设置数据的有效时间,数据过期以后,就需要将数据从内存中删除掉。可以按照不同的规则进行删除,这种删除规则就被称之为数据的删除策略 (数据过期策略)
Redis数据删除策略-惰性删除
惰性删除:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key
Redis数据删除策略-定期删除
定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)。
定期清理有两种模式:
SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf 的hz 选项来调整这个次数
FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms
假如缓存过多,内存是有限的,内存被占满了怎么办?(数据淘汰策略)
1.2分布式锁
setnx、redisson
1.3redis集群相关问题
有哪些集群模式
1、主从模式
全量同步
1.从节点请求主节点同步数据 (replication id、 offset)
2.主节点判断是否是第一次请求,是第一次就与从节点同步版本信息 (replication id和offset)
3.主节点执行bgsave,生成rdb文件后,发送给从节点去执行
4.在rdb生成执行期间,主节点会以命令的方式记录到缓冲区(一个日志文件)
5.把生成之后的命令日志文件发送给从节点进行同步
增量同步
1.从节点请求主节点同步数据,主节点判断不是第一次请求,不是第一次就获取从节点的offset值
2.主节点从命令日志中获取offset值之后的数据,发送给从节点进行数据同步
2、哨兵模式
分片集群
1.3消息队列、延迟队列用何种数据类型
消息队列: list,PubSub,Stream
延迟队列:zset