11、Redis实战:分布式缓存

目录

1、 1单点Redis存在的问题;

1、 2Redis持久化;

1、 2.1RDB持久化方式;

1、 2.2AOF持久化方式;

1、 3RDB和AOF持久化方式对比分析;

1、 4Redis主从集群;

1、 4.1搭建Redis主从架构;

1、 4.2数据同步原理;

1、 5Redis的哨兵;

1、 5.1Redis哨兵的作用和原理;

1、 6Redis分片集群;

1、 6.1分片集群结构;

1、 6.2散列插槽;

1、 6.3数据迁移;

1.1 单点Redis存在的问题

*

1.2 Redis持久化

1.2.1 RDB持久化方式

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

快照文件称为RDB文件,默认是保存在当前运行目录。

Redis停机时会执行一次RDB。

*

小总结:

RDB方式bgsave的基本流程?

1、 fork主进程得到一个子进程,共享内存空间;

2、 子进程读取内存数据并写入新的RDB文件;

3、 用新RDB文件替换旧的RDB文件;

RDB会在什么时候执行?save 60 1000代表什么含义?

•默认是服务停止时。

•代表 60 秒内至少执行 1000 次修改则触发 RDB

RDB的缺点?

1、 RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险;

2、 fork子进程、压缩、写出RDB文件都比较耗时;

1.2.2 AOF持久化方式

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

*

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

*

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置。

1.3 RDB和AOF持久化方式对比分析

*

1.4 Redis主从集群

1.4.1 搭建Redis主从架构

*

小总结:

假设有A、B两个Redis实例,如何让B作为A的slave节点?

•在B 节点执行命令: slaveof A 的 IP A 的 port。

1.4.2 数据同步原理

*

master如何判断slave是不是第一次来同步数据?这里会用到两个很重要的概念:

•Replication Id :简称 replid ,是数据集的标记, id 一致则说明是同一数据集。每一个 master 都有唯一的 replid , slave 则会继承 master 节点的 replid

•offset :偏移量,随着记录在 repl_baklog 中的数据增多而逐渐增大。 slave 完成同步时也会记录当前同步的 offset 。如果 slave 的 offset 小于 master 的 offset ,说明 slave 数据落后于 master ,需要更新。

因此slave做数据同步,必须向master声明自己的replication id 和offset,master才可以判断到底需要同步哪些数据?

*

* 小总结:

简述全量同步的流程?

•slave 节点请求增量同步;

•master 节点判断 replid ,发现不一致,拒绝增量同步;

•master 将完整内存数据生成 RDB ,发送 RDB 到 slave;

•slave 清空本地数据,加载 master 的 RDB;

•master 将 RDB 期间的命令记录在 repl_baklog ,并持续将 log 中的命令发送给 slave;

•slave 执行接收到的命令,保持与 master 之间的同步。

* *

总结:

简述全量同步和增量同步区别?

•全量同步: master 将完整内存数据生成 RDB ,发送 RDB 到 slave 。后续命令则记录在 repl_baklog ,逐个发送给 slave 。

•增量同步: slave 提交自己的 offset 到 master , master 获取 repl_baklog 中从 offset 之后的命令给 slave。

什么时候执行全量同步?

•slave 节点第一次连接 master 节点时;

•slave 节点断开时间太久, repl_baklog 中的 offset 已经被覆盖时。

什么时候执行增量同步?

•slave 节点断开又恢复,并且在 repl_baklog 中能找到 offset 时。

1.5 Redis的哨兵

1.5.1 Redis哨兵的作用和原理

*

1.5.1.1 服务状态监控

*

1.5.1.2 选举新的Master

一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:

•首先会判断 slave 节点与 master 节点断开时间长短,如果超过指定值( down-after-milliseconds * 10 )则会排除该 slave 节点

•然后判断 slave 节点的 slave-priority 值,越小优先级越高,如果是 0 则永不参与选举

•如果 slave- prority 一样,则判断 slave 节点的 offset 值,越大说明数据越新,优先级越高

•最后是判断 slave 节点的运行 id 大小,越小优先级越高。

1.5.1.3 如何实现故障转移

*

总结:

Sentinel的三个作用是什么?

•监控

•故障转移

•通知

Sentinel如何判断一个redis实例是否健康?

•每隔 1 秒发送一次 ping 命令,如果超过一定时间没有相向则认为是主观下线

•如果大多数 sentinel 都认为实例主观下线,则判定服务下线

故障转移步骤有哪些?

•首先选定一个 slave 作为新的 master ,执行 slaveof no one

•然后让所有节点都执行 slaveof 新 master

•修改故障节点,执行 slaveof 新 master

1.6 Redis分片集群

1.6.1 分片集群结构

*

1.6.2 散列插槽

*

小总结:

Redis如何判断某个key应该在哪个实例?

•将16384 个插槽分配到不同的实例

•根据 key 的有效部分计算哈希值,对 16384 取余

•余数作为插槽,寻找插槽所在实例即可

如何将同一类数据固定的保存在同一个Redis实例?

•这一类数据使用相同的有效部分,例如 key 都以 { typeId } 为前缀。

1.6.3 数据迁移

*

参考文献:

黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目_哔哩哔哩_bilibili

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: