Redis常见面试题整理

什么是 Redis?

redis是一个开源的、高性能的、基于内存的key-value NoSQL数据库,数据类型以及适用场景都很丰富

Redis 的数据类型?

redis的常用数据类型有:string、list、set、zset、hash五种
list:通过双端链表或压缩列表实现
hash:通过压缩列表或哈希表实现
	1.当使用ziplist,也就是压缩列表作为底层实现时,新增的键值对是保存到压缩列表的表尾。key和value依次作为列表元素存放
	2.hashtable 编码的哈希表对象底层使用字典数据结构,哈希对象中的每个键值对都使用一个字典键值对。
	3.在前面介绍压缩列表时,我们介绍过压缩列表是Redis为了节省内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构,相对于字典数据结构,压缩列表用于元素个数少、元素长度小的场景。其优势在于集中存储,节省空间。
set:intset或hashtable
	1.intset 编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合中。
	2.hashtable 编码的集合对象使用 字典作为底层实现,字典的每个键都是一个字符串对象,这里的每个字符串对象就是一个集合中的元素,而字典的值则全部设置为 null。这里可以类比Java集合中HashSet 集合的实现,HashSet 集合是由 HashMap 来实现的,集合中的元素就是 HashMap 的key,而 HashMap 的值都设为 null
zset:
	1.ziplist 编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个节点保存元素的分值。并且压缩列表内的集合元素按分值从小到大的顺序进行排列,小的放置在靠近表头的位置,大的放置在靠近表尾的位置。
	2.skiplist 编码的有序集合对象使用 zet 结构作为底层实现,一个 zset 结构同时包含一个字典和一个跳跃表

使用redis有哪些好处?

1.数据存储在内存中,读写速度快,且支持持久化
2.丰富的数据类型和特性支持,可支持缓存、消息、分布式锁等多种业务场景
3.支持事务,操作都是原子性的,要么全部执行,要么不执行,虽然是伪事务,失败无法回滚

Redis 相比 Memcached 有哪些优势?

1.数据类型更加丰富
2.支持持久化
3.支持主从复制、集群部署,memcached需要依赖客户端实现集群部署
4.value能放更大的数据

Memcache 与 Redis 的区别都有哪些?

1.redis是单线程模型,io复用程序接收客户端事件并顺序压入队列,事件分派器单线程消费事件,使用相应事件处理器处理;memcache是多线程模型
2.redis支持持久化
3.redis支持更丰富的数据类型
4.memcache的key、value可存放数据大小均比redis小
5.memcache的读性能要比redis快
6.redis支持事务、主从复制、哨兵模式、集群部署,memcache只能单机部署,或者依赖客户端实现集群

Redis 是单进程单线程的?

redis是单进程的,但并不是单线程的,只是redis的事件分派器是单线程模型,所以真正的数据处理是单线程的

一个字符串类型的值能存储最大容量是多少?

512M

Redis 的持久化机制是什么?各自的优缺点?

rdb:定期对redis数据生成快照持久化到磁盘,文件后缀为.rdb,重启后会从rdb文件中回复数据
rdb优点:文件紧凑,恢复速度快,适合数据全量复制和备份场景,对性能影响较小,在需要保存rdb文件时会fork出一个子进程来处理,父进程无需进行磁盘io操作
rdb缺点:无法满足实时持久化,在高并发的场景下,短时间可能有大量数据进入redis,持久化时间延迟越高,故障重启后数据丢失越严重;在数据量比较大、cpu资源也比较紧张的时候,fork子进程耗时可能比较高,会造成毫秒级停顿
aof:将redis的写命令写入文件,当redis重启后可以重新执行命令恢复数据,aof文件过大时,redis会fork出子进程执行aof重写
aof优点:秒级持久化,由于是记录写操作,所以兼容性更好;
aof缺点:文件大,恢复速度慢

redis常见性能问题及解决方案?

1.master不要开启持久化,如果数据比较重要,在slaver中开启aof
2.保证master和slaver的网络稳定;主从复制时,当slaver初次连上master,master会dump全量rdb快照然后同步给slaver,后续增量同步;如果master和slaver断连,会重复上述操作,全量dump影响master性能,可能造成master的短暂停顿
3.尽量避免在压力较大的主库上增加从库
4.为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<--Slave1<--Slave2<--Slave3.......,这样的结构也方便解决单点故障问题,实现Slave对Master的替换,也即,如果Master挂了,可以立马启用Slave1做Master,其他不变。

为什么redis单线程模型性能仍然很好?

1.纯内存操作
2.避免了不必要的线程上下文切换和锁开销
3.基于非阻塞的io多路复用

Redis的回收策略(淘汰策略)?

1.volatile-lru:从设置了过期时间的key中挑选最近最少使用的执行删除
2.allkeys-lru:从所有数据中选择最近最少使用的key执行删除
3.volatile-ttl:从设置了过期时间的key中选择将要或已经过期的执行删除
4.volatile-lfu:从设置了过期时间的key中挑选最近使用次数最少的key执行删除
5.allkeys-lfu:从所有数据中选择最近使用次数最少的key执行删除
6.volatile-random:从设置了过期时间的key中随机选择一些key执行删除
7.allkeys-random:从所有数据中随机选择一些key执行删除
8.no-enviction:禁止驱除数据(默认)

redis过期键删除的策略?

1.惰性删除:在操作某个key之前对key进行过期时间的检查,如果过期,删除
2.定期删除:依次遍历所有db,随机取出一定数量的key,判断是否过期,如果过期则清除,如果过期key数量小于一定比例,则遍历下一个db,直到本次清理时间达到允许最大值
3.定时删除:写入一个key且设置了过期时间时,创建一个timer为这个key计时,过期则删除
4.从节点不会主动清理过期key,master清理过期key后会把删除指令同步到slaver节点

redis为什么将所有数据放到内存中?

为了保证最大化的读写性能,选择把数据全部存在内存中,异步持久化到硬盘

Redis 的同步机制

1.slaver启动后读取master节点的host和port,与master建立socket连接
2.全量复制:slaver向master发送sync,master节点fork子进程生成全量数据的rdb文件后同步给slaver,slaver收到rdb之后将数据恢复至内存;
3.增量复制:全量复制之后master会将执行过的写指令,通过刚刚建立的连接同步给slaver执行

Pipeline有什么好处,为什么要用pipeline?

可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。

Redis Sentinal哨兵模式的作用和原理?

Redis Sentinal主要作用是高可用,通过sentinal集群监控一个或多个master节点,以及他们的从节点,当master节点下线后,将其中的一个从节点提升为新的master节点
	1.每两秒中Sentinal集群通过master节点的订阅发布模型交换数据
	2.每十秒钟Sentinal集群中的每一个节点对master和slave节点执行info命令,目的是:1.发送slave节点;2.确定主从关系
	3.Sentinal集群中的每一个节点对其他Sentinal节点、master及其slave节点发送ping指令,若目标节点在规定的时间内没能正确回复ping指令,那么这个节点被发送ping指令的Sentinal节点标记为主观下线;
	4.一个sentinal节点标记master为主观下线后,会发送SENTINEL is_master_down_by_addr指令至其他sentinal节点确定master是否也被标记为了主观下线,并要求对方同意自己为本次故障转移的leader节点,如果超过一定数量的sentinal节点认为master节点主观下线,那么该master节点被标记为客观下线
	5.如果在sentinal节点互相确认master是否客观下线之后,并且sentinal在确认过程中已经有节点当选为故障转移的执行leader,那么开始执行故障转移,否则暂停一段时间后再次选举leader,选举命令仍通过sentinel is-master-down-by-addr执行进行
	6.leader节点向主观下线的master节点下的某个从节点发送SLAVEOF NO ONE指令,并通过info指令看到其作为新master节点的信息,sentinal leader节点将新的配置广播给其他的sentinal节点,向已下线的master服务及其他所有slave节点发送SLAVE OF命令,使他们成为新的master的slave节点

Redis Cluster集群

redis集群部署方案:数据分片存储,解决存储瓶颈,流量分流,解决并发瓶颈
	1.集群架构
		1.预设16384个虚拟槽存储数据,集群中每个redis节点负责一部分虚拟槽,集群中的所有redis节点都能互相通信并且知道其他节点负责的虚拟槽范围
		2.集群中所有redis节点基于gossip协议进行节点间状态的检测、元数据信息的交换、新节点的加入
		3.客户端发送指令给集群中的某个master节点,并携带通过key计算的虚拟槽,如果这个master节点负责这个虚拟槽节点,执行指令,如果不是,从元数据信息中找到槽所在节点并给客户端返回moved,客户端收到moved之后重定向至目标master节点执行指令
		4.集群支持主从架构,master作为集群中的一个节点,集群默认不支持slave节点的读写,这里的slave作主备切换保证高可用,做数据的热备;读写分离只是为了提升读吞吐量,保证master的写性能,直接在集群中扩展节点就能实现,没有必要再读写分离
	2.节点通信
		1.redis cluster基于gossip协议通讯,每个节点都有一个专门用来与其他节点通讯的端口(port + 10000),主要监测节点状态,交换故障信息、虚拟槽信息、节点的增删信息
		2.redis节点向新加入的节点发送meet指令,并携带元数据信息,新加入的节点返回pong后开始与集群中的节点通信
		3.每个redis节点会频繁向其他节点发送ping执行,并携带自己的状态信息、元数据信息,目标节点返回pong指令并携带自己的元数据信息,集群中的节点通过这个环节彼此交换更新元数据信息;当集群节点太多,如果每次ping其他所有节点,会占用大量的带宽,所以,每次会挑选5个最不经常ping的节点;当然,如果发现一个节点没有ping的时间达到了阈值,会立即发送ping,避免数据交换延迟
		4.当某个节点发现另一个节点宕机时,通过向其他节点发送fail指令同步节点宕机信息
	3.主备切换
		1.redis集群支持主备,主节点作为集群中的一个节点,几乎跟哨兵类似
		2.当一个节点认为另一个节点宕机,则标记为主观宕机;当过半数的节点任务某个节点宕机,标记为客观宕机;
		3.当一个master节点被标记为客观宕机,集群所有的master节点会从其从节点中按优先级投票选举新的master节点,主备切换

redis集群不可用的几种情况

1.redis集群中半数master节点宕机
	无法成功选举(成功选举需过半数master节点投票)
2.redis集群中某个master节点及其从节点全部宕机
	虚拟槽有空缺,挂掉的master负责的虚拟槽无法正常使用(可通过配置让集群允许部分失败)

Redis 支持的 Java 客户端都有哪些?官方推荐用哪个

Redisson,Jedis,lettuce等等,官方推荐使用Redisson

Jedis 与 Redisson 对比有什么优缺点?

Jedis是Redis的java实现客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务‘管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

基于redis如何实现分布式锁

如何优雅地用Redis实现分布式锁

缓存雪崩

原因:短时间内缓存大面积失效,大量的请求直接打到数据库上,导致数据库宕机
方案:
	1.保证缓存系统的高可用,选择合适的淘汰策略,选择合适的数据备份策略,第一时间恢复数据
	2.使用本地缓存,例如ehcache,在分布式缓存大面积失效时,能够避免请求直接到数据库
	3.请求限流、降级,通过一些备选方案或者直接失败,避免大量请求到数据库数据库

缓存击穿

原因:短时间内大量请求不存在的数据,导致请求透过缓存直接打到数据库上
方案:采用布隆过滤器,将所有存在数据提前hash到一个足够大的bitmap上,如果有一定不存在的数据请求,直接过滤掉

如何保证缓存与数据库双写时的数据一致性?

要保证强一致性,可以将读写请求串行到一个队列中
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值