下面要给大家带来的是一整套的redis集群面试题,包含了具体的面试题目和答案,想要来看这方面面试题的小伙伴可以来了解一下。

一、面试题及答案

1、Redis有哪些适合的场景?

(1)Session共享(单点登录);(2)页面缓存;(3)队列;(4)排行榜/计数器;(5)发布/订阅;

2、Redis主要功能有哪些?

(1)LUA脚本:在事务的基础上,假如,需要在服务端一次性的执行更复杂的操作,那么,这个时候lua就可以上场了。

(2)事务:在大多数的情况之下,我们需要一次执行不止一个的命令,除此之外,还要其同时的成功或者是失败。

redis对事务的支持也是来源于这部分的需求,也就是支持一次性按顺序执行多个命令的能力,并且,保证其原子性。

(3)集群:单台服务器资源的是有上限的,CPU资源和IO资源我们可以通过主从复制,进行读写分离,将一部分CPU和IO的压力转移到从服务器上,这和mysql数据库的主从同步有点类似。

(4)哨兵(Sentinel)和复制(Replication)

(5)持久化:指的是redis会将内存中的数据写入到硬盘当中,在redis重新启动的时候加载这些数据,从而最大限度的降低缓存丢失带来的影响。

3、使用Redis的优势有哪些?

(1)支持string,list,set,sorted set,hash,数据类型丰富

(2)能够用于缓存,消息,按key设置过期时间,过期之后,就会自动删除,特性丰富

(3)数据存在内存当中,和HashMap类似,HashMap的优势就是查找和操作的时间复杂度都是O(1),速度快

(4)支持事务,操作都是原子性(对数据的更改要么全部执行,要么全部不执行)

4、Redis淘汰策略

(1)noenviction:禁止淘汰数据

(2)volatile-lru:从已设置过期的数据集中挑选最近最少使用的淘汰

(3)allkeys-random:从数据集中任意挑选数据淘汰

(4)volatile-ttr:从已设置过期的数据集中挑选将要过期的数据淘汰

(5)allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

(6)volatile-random:从已设置过期的数据集中任意挑选数据淘汰

(4)allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

5、Redis读写分离模型

通过增加Slave DB的数量,读的性能能够线性增长。

为了避免Master DB的单点故障,集群通常都会采用两台Master DB做双机热备,所以整个集群的读和写的可用性都非常高。

读写分离架构的缺陷在于,不论是Master还是Slave,每个节点都必须保存完整的数据,假如在数据量非常大的情况下,集群的扩展能力还是受限于单个节点的存储能力,并且对于Write-intensive类型的应用,读写分离架构并不适合。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

6、Redis回收使用的是什么算法?

LRU算法

7、Redis回收进程是怎样工作的?

一个客户端运行了新的命令,添加了新的数据。

Redi检查内存使用情况,假如大于maxmemory的限制, 那么就依据设定好的策略进行回收。

8、Redis怎样做内存优化?

尽可能使用散列表,散列表使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。

9、Redis集群会有写操作丢失吗?为什么?

Redis并不可以保证数据的强一致性,这也就意味,在实际中集群在特定的条件下可能会丢失写操作。

10、Redis集群最大节点个数是多少?

Redis集群预分好16384个桶(哈希槽)

11、Redis常见性能问题有哪些?解决方案

(1)主从复制不要用图状结构,用单向链表结构更为稳定,也就是:Master <- Slave1 <- Slave2 <- Slave3…

这样的结构方便解决单点故障问题,实现Slave对Master的替换。

假如说,Master挂了,那么,就可以立马启用Slave1做Master,其他的保持不变。

(2)Master最好是不要做任何持久化工作。

(3)避免在压力很大的主库上增加从库。

(4)假如数据很重要的话,某个Slave开启AOF备份数据,策略设置为每秒同步一次。

(5)为了主从复制的速度和连接的稳定性,Master和Slave最好是在同一个局域网当中。

12、Redis数据分片模型

为了能够解决读写分离模型的缺陷,可以将数据分片模型应用进来。可以将每个节点看成都是独立的master,之后通过业务实现数据分片。结合上面两种模型,可以将每个master设计成由一个master和多个slave组成的模型。