Redis面试题

一、Redis是什么?
        Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、zset(sorted set --有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

二、Redis 的持久化机制

        Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。

        Redis 的持久化机制有两种,第一种是快照(RDB--默认机制),第二种是 AOF 日志

        RDB持久化通过保存数据库中的键值对来记录数据库状态不同AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的(不记录读命令)

        快照是把整个内存数据映射到硬盘中,保存一份到硬盘,因此恢复数据起来比较快,把数据映射回去即,如果系统发生崩溃,会丢失最近一次持久化到发生崩溃这段时间的数据。

AOF方式的三种写入策略:

(1)appendfsync always # 每次写操作都会记入aof文件,最安全但降低redis的速度;
(2)appendfsync everysec # 每隔1秒同步一次写操作,理论上最多只会丢失1秒的数据,是兼顾数据安全和性能的方案;
(3)appendfsync no     # 让操作系统决定何时同步,不推荐,会丢失不定量的数据。
 

AOF后台重写机制
​ 随着写操作的不断执行,AOF文件会变得越来越大,这就会带来一些性能问题(比如恢复慢)。所以当AOF文件大小超过阈值时,redis就会进行AOF重写。redis服务器会创建一个新的AOF文件来覆盖现有的AOF文件,新的文件中减少了冗余的命令。

为什么要创建一个新的文件而不直接对原先文件进行修改删除呢?

因为如果在原先文件上操作,重写失败的话,原先的文件就会被污染,这就导致我们无法回到之前的状态了。而创建一个新的文件就算重写失败了,对原文件也没有影响。
最有效恢复数据的方式

其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,RDB记录的是上次持久化的数据,AOF记录从上次持久化到当前这段时间的写操作,通常这部分文件会很小,恢复数据的时候,先加载RDB文件,再执行AOF,使效率提高。

三、Redis高可用集群

Redis高可用集群有两种,分别是主从哨兵模式和集群模式
1、主从哨兵模式
        其中一台服务器作为master服务器,提供读写服务,配置多台从服务器,从服务器只提供只读服务,同时配置多台sentinel,也即是哨兵,哨兵的作用是可以监控master节点,如果master宕机,可以从从服务器中选举出一台作为master服务器。
哨兵模式,客户端连接哨兵集群,即可获得master服务器的信息。此时客户端并不会做读写分离,也就是所有读写都由master服务器处理,这里相当于从服务器只作为主服务器的数据备份。如果master发生故障,切换到其他从服务器,哨兵会把新的master服务器地址告知客户端。

        这种模式下,是有哨兵监控master服务器状态,并实现故障转移。一旦master服务器宕机,则哨兵会从剩下的从服务器中选举一条作为新的master节点。这里有几个概念:
主观下线:
        哨兵会定期向主服务器发送心跳包检测是否正常,如果超过配置文件中配置的时间没有收到主服务器的回复,则这个哨兵认为主服务下线。
客观下线:
一个哨兵把master记为主观下线,并不代表master就一定下线了,此时要向其他哨兵确认master是否真的下线,如果半数以上的哨兵认为master下线,则记为客观下线。
哨兵选举master服务器过程

(1)先从哨兵中选举出一个leader,并由这个leader选举出新的master
(2)过滤故障节点,从剩余的节点中按照下列规则选出master
(3)优先选择slave-priority最大的从节点作为主节点
(4)其次选择数据偏移量最大的节点
(5)选择runid最小的从节点

2、Cluster集群模式

        在主从哨兵模式,所有的写操作都是由master处理,这在性能上可能会出现瓶颈。Redis3.0后推出了集群模式,可以实现水平扩展,配置多台的master服务器处理读写请求。
        集群模式下,看似于将一个大的主从架构拆分成多个主从架构的服务器群,具有复制,高可用和分片的特性。不需要哨兵,也可以实现节点故障移除和master选举功能。性能和高可用性均优于哨兵模式,但需要更多的服务器。
        Cluster集群模式下,Redis默认从服务是不分担读请求,只作为备注和故障转移。但有读请求到达从服务器,会重定向到主服务器处理。

选举

(1)slave发现自己的master下线后,会广播故障转移信息到其他master节点
(2)master接收到slave故障转移请求后,首先会检测请求的合法性,然后发送响应ack给slave,每轮投票,master只会响应一次
(3)一旦一个slave接收超过半数master的ack后,则被选中成为新的master,否则会进行下一轮的投票
 

你可能感兴趣的:(redis,数据库,缓存)