黑马面试专题-Redis总结
Redis
Redis数据过期策略
1、惰性删除
访问key的时候判断数据是否过期,如果过期,删除
2、定期删除
定期检查一定量的key是否过期(SLOW模式 + FAST模式)
SLOW模式:通过定时任务,默认10HZ,每次不超过25ms,可以修改配置文件redis.conf的hz选项来调整这个次数
FAST模式:时间不固定,每次事件循环会尝试执行,但是两次间隔不低于2ms,耗时不超过1ms
Redis的过期策略:惰性删除 + 定期删除
Redis的淘汰策略
理解:当Redis中的内存不够用的时候,redis会进行淘汰策略,redis会按照某一个规则将数据删除。
- noeviction:不淘汰任何key,当内存满的时候不允许写入新数据,默认
- volatile-ttl :对设置了TTL的key,比较key的剩余TTL大小,TTL越小先被淘汰
- allkeys-random:对全体key,随机进行淘汰
- volatile-random:对设置了TTL的key,随机进行淘汰
- allkeys-lru:对全体key,基于LRU算法进行淘汰(最近最少使用:通过基于访问时间的大小进行删除)
- volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰(最近最少使用:通过基于访问时间的大小进行删除)
- allkeys-lfu:对全体key,基于LFU算法进行淘汰(最少频率使用:统计每个key访问频率,值越小优先被淘汰)
- volatile-lfu: 对设置了TTL的key,基于LFU算法进行淘汰(最少频率使用:统计每个key访问频率,值越小优先被淘汰)
使用建议
- 优先使用它allkeys-lru,把经常访问的数据保留到缓存中
- 对于业务中访问频率不大,没有数据冷热区分,建议使用sllkeys-random,随机淘汰
- 如果业务中有顶置需求,可以使用volatile-lru,同时不设置顶置数据过期时间,这些数据就一直不被删除
- 如果业务中有短期高频访问的数据,可以使用allkeys-lfu和volatile-lfu
Redis分布式锁
redssion分布式锁
Redis分布式锁怎么实现
-
先按照自己简历上的业务进行描述分布式锁的应用场景
-
我们当时用redission实现分布式锁,底层是使用setnx和lua脚本(保证原子性)
Redision实现分布式锁如何合适控制锁的有效时常
-
在redission的分布式锁中,提供了WatchDog,一个线程获取锁成功后,WatchDog单独开一个线程监听会给持有锁的线程续期(每隔10s)
Redission的这个锁,可以重入吗
-
可以重入,多个锁重入需要判断是否是同一个线程,在redsi中进行存储的时候使用hash结构,来存线程信息和冲入次数
Redssion锁能解决主从数据一致性吗
-
不能解决,但可以使用它redission提供的红锁来解决,但是性能就降低了。如果非要保证数据的强一致性,可以使用zookeeper实现分布式锁
Redis其他问题
Reids集群有哪些方案?
- 主从复制
- 哨兵模式
- 分片集群
主从复制 (高并发)
介绍一下redis的主从同步
单节点Redis的并发能力有限,要进一步提高redis的并发能力,需要搭建主从集群,实现读写分离,主节点负责写数据,从节点负责读数据
能说一下,主从同步数据的流程
replication id :数据集id
offset:偏移量
全量同步:
- 从主节点同步数据(replication id、offset)
- 主节点执行bgsave,生成rbd文件后,发送给从节点
- 在rbd生成期间,主节点会以命令的方式记录到缓冲区(一个日志文件)
- 把生成之后的命令日志文件发送给从节点进行同步
增量同步:
- 主节点判断是否是第一次请求(判断replication id),是第一次就同步版本信息(replication id、offset)
- 主节点从命令日志获取offset值之后的数据,发送给从节点进行同步
哨兵模式(高可用)
Redis提供了哨兵模式机制来实现主从集群的自动故障恢复,防止主节点宕机,但是不能写数据。
怎么保证Redis的高并发高可用?
哨兵模式:实现主从集合的自动故障恢复
你们使用Redis是单点还是集群,那种集群?
主从(1主1从)急啊哨兵就可以解决。单点不超过10G内存,如果Redis内存不足则可以根据不同服务分配独立的Redis主从点
Redis集群脑裂,该怎么解决
集群脑裂是由于主节点和从节点和哨兵处于不同的网络分区,使哨兵没有感知到主节点的心跳没,所以通过选举的方式及提升一个从节点作为主节点,这样就会有刘昂个主节点。会导致客户端还在老的主节点写入数据,新节点无法同步,当网络恢复后,哨兵会把老的主节点降低为从节点,导致数据丢失
解决:我们可以修改redis配置文件,设置最少从节点数量以及缩短主从数据同步的延迟时间,达不到要求就拒绝请求
分片集群结构(海量数据)
redis分片集群有什么作用
- 集群中有多个master,每个master保存不同数据
- 每个master都可以有多个slave节点
- master之间通过ping检测彼此的健康状态
- 客户端可以访问集群中任务节点,最终通过路由被转发到正确的节点
Redis分片集群中数据是怎么存储和读取的?
-
Redis分片集群引入了哈希槽的概念,Redis集群有16384个哈希槽
-
将16384个哈希槽分配给不同的实例
-
读写数据:给很具key的有效部分细算哈希值,对16384取余数(有效部分,如果key前面右大括号。大括号里面的就是有效部分,如果没有。则以key本身作为有效值)
Redis是单线程,但是为什么还那么快?
- 完全基于内存的,C语言编写
- 采用单线程,避免了不必要的上下文切换
- 使用多路I/O复用模型,非阻塞IO
解释一下I/O多路复用
是指单个线程来同时监听多个Socket,并在某个Socket可读可的时候得到通知,从而避免了无效的等待,充分利用CPU。目前I/O多路复用采用epoll模式实现,他会通知用户进程Socket就绪的通知,还会把已就绪的Socket写入用户空间,不需要挨个遍历来判断Socket是否就绪,提升了性能。
Redis网络模型
就是使用I/O多路复用结合事件的处理器来应对多个Socket请求
- 链接应答处理器
- 命令回复处理器,在Redis6.0之后,为了提升性能,使用多线程来处理回复事件
- 命令请求处理器,在Redis6.0之后,将命令的转换使用了多线程,增加了命令转换速度,在命令执行的时候,依然是单线程。
