目录
一、Redis持久化机制有哪些?有什么区别?
redis提供了两种持久化机制:RDB(redis database)和AOF(append-only file)。这两种机制各有优缺点使用不同的场景。
1、RDB(redis database)
RDB是一种快照持久化方式他会在指定的时间间隔内将redis的数据集保存到一个二进制文件中。
特点:
- 高效:RDB 文件是一个紧凑的二进制文件,适合用于备份和恢复。
- 快速恢复:由于是全量数据快照,恢复速度较快。
- 性能影响:在生成RDB文件时,redis会分出一个紫禁城来进行持久化操作,父进程继续处理客户端请求,因此对性能影响较小。
对应有如下三种配置:
save 900 1 # 900秒内至少有1个key发生变化,则执行RDB
save 300 10 # 300秒内至少有10个key发生变化,则执行RDB
save 60 10000 # 60秒内至少有10000个key发生变化,则执行RDB
缺点:
- 数据丢失风险:如果在两次快照之间发生故障,这段时间内的数据将会丢失。
- 内存消耗:生成 RDB 文件时,需要占用额外的内存。
2、AOF
AOF是一种日志持久化方式,他会将redis执行的每个写操作追加到一个日志文件中。
特点:
- 数据完整性:AOF 记录了所有的写操作,因此数据完整性较高,即使发生故障,也可以通过重放日志文件来恢复数据。
- 灵活性:AOF提供了多种同步策略,可以根据需求选择不同的数据安全和性能平衡。
配置有三种第一种是always一直开启这种比较耗性能,第二种是everyseconds每秒执行,这种可能会丢失数据,但是丢失只会丢失一秒内的数据。另一种是no不开启。
缺点:
- 文件体积大:AOF 文件通常比 RDB 文件大,因为它记录了所有的写操作。
- 恢复速度慢:由于需要重放所有的写操作,恢复速度较慢。
3、区别
特性 | RDB | AOF |
---|---|---|
数据完整性 | 较低(可能丢失两次快照间的数据) | 较高(记录所有写操作) |
文件体积 | 较小(二进制快照) | 较大(记录所有写操作) |
恢复速度 | 较快(全量数据快照) | 较慢(需要重放日志) |
性能影响 | 较小(fork子进程) | 较大(频繁写日志) |
适用场景 | 数据备份、快速恢复 | 数据完整性要求高 |
二、redis的主从集群有什么用?
1、什么是redis的主从集群
redis主从集群结构如图:
在该图中有一个redis集群,集群中有一个master节点,两个slave节点,当我们通过redis的java客户端访问主从集群是,应该做好路由。
-
如果是写操作,应该访问master节点,master会自动将数据同步给两个slave节点
-
如果是读操作,建议访问各个slave节点,从而分担并发压力
2、为什么要使用redis主从集群(也就是有什么用)
单节点的redis的并发能力是有上限的,要进一步tigaoredis的并发能力就需要搭建主从集群,从而实现读写分离,从而实现提高redis的读功能的高并发。
三、redis的哨兵集群有什么用?
1、什么是redis的哨兵集群
redis提供了哨兵(sentilel)机制来监控主从集群状态,确保集群的高可用性。哨兵集群的原理图如下:
2、哨兵的作用
-
状态监控:
Sentinel
会不断检查您的master
和slave
是否按预期工作。 -
故障恢复:如果master故障,sentinel会将一个slave提升为master。当故障实例恢复后会成为slave。
-
状态通知:sentinel充当redis客户端的服务发现来源,当集群发生failover时,会将最新的集群信息推送给redis的客户端。
sentinel如何知道一个redis节点是否宕机的?
sentinel基于心跳机制检测服务状态,每隔一秒向集群的每个节点发送ping命令,并通过实力的响应结果来做出判断:
-
主观下线(sdown):如果某sentinel节点发现某Redis节点未在规定时间响应,则认为该节点主观下线。
-
客观下线:若超过指定数量的sentinel都认为该节点主观下线,则该节点客观下线。通常为大于一半时认为该节点客观下线,sentinel节点数量至少三台。
如图:
3、总结
Sentinel的三个作用是什么?
-
集群监控
-
故障恢复
-
状态通知
Sentinel如何判断一个redis实例是否健康?
-
每隔1秒发送一次ping命令,如果超过一定时间没有相向则认为是主观下线(
sdown
) -
如果大多数sentinel都认为实例主观下线,则判定服务客观下线(
odown
)
故障转移步骤有哪些?
-
首先要在
sentinel
中选出一个leader
,由leader执行failover
-
选定一个
slave
作为新的master
,执行slaveof noone
,切换到master模式 -
然后让所有节点都执行
slaveof
新master -
修改故障节点配置,添加
slaveof
新master
sentinel选举leader的依据是什么?
-
票数超过sentinel节点数量1半
-
票数超过quorum数量
-
一般情况下最先发起failover的节点会当选
sentinel从slave中选取master的依据是什么?
-
首先会判断slave节点与master节点断开时间长短,如果超过
down-after-milliseconds * 10
则会排除该slave节点 -
然后判断slave节点的
slave-priority
值,越小优先级越高,如果是0则永不参与选举(默认都是1)。 -
如果
slave-prority
一样,则判断slave节点的offset
值,越大说明数据越新,优先级越高 -
最后是判断slave节点的
run_id
大小,越小优先级越高(通过info server可以查看run_id
)。
四、redis分片集群有什么用?
1、什么是分片集群?
分片的意思,就是把数据拆分存储到不同节点,这样整个集群的存储数据量就更大了。
redis分片集群的结构如图:
分片集群特征:
-
集群中有多个master,每个master保存不同分片数据 ,解决海量数据存储问题
-
每个master都可以由多个slave节点,确保高可用。
-
master之间通过ping监测彼此状态,类似哨兵作用。
-
客户端请求可以访问集群任意节点,最终都会被转发到数据所在节点。
2、分片集群的作用?
分片集群主要是用来解决两个问题
-
海量数据存储
-
高并发写
3、总结
1. redis分片集群的原理?
redis利用散列插槽的方式实现数据分片,在redis集群中共有16384个散列插槽,集群中的每一个节点都会分配一定数量的散列插槽。具体的分配在创建集群时就已经指定了。
2. redis分片集群如何判断某个key应该在哪一个实例?
-
将16384个插槽分配到不同的实例
-
根据key计算哈希值,对16384取余
-
余数作为插槽,寻找插槽所在实例即可
3. 如何将同一类型的数据固定的保存在同一个redis实例中?
-
Redis计算key的插槽值时会判断key中是否包含
{}
,如果有则基于{}
内的字符计算插槽 -
数据的key中可以加入
{类型}
,例如key都以{typeId}
为前缀,这样同类型数据计算的插槽一定相同