文章

Redis 主从架构

Redis主从架构

redis主从架构

Redis主从工作原理

如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个SYNC(在redis2.8版本之前)命令给master请求复制数据

master收到SYNC命令后,

  1. 会在后台进行数据持久化通过bgsave生成最新的rdb快照文件,
  2. 持久化期间,master会继续接受客户端的请求,它会把这些请求缓存在内存中,
  3. 当持久化进行完毕之后,master会把这份rdb文件数据集发给slave,
  4. slave会把接收到的数据进行持久化生成rdb,然后在加载到内存中,
  5. 然后,master再将之前缓存在内存中的命令发送给slave。

当master与slave连接断开时,slave能够自动重连master,如果master收到了多个slave并发连接请求,它只会进行一次持久化,而不是一个连接一次,然后再把这一份持久化的数据发送给多个并发连接的slave

当master和slave断开重连后,一般都会对数据进行复制,但从redis2.8版本开始,master和slave断开重连后支持部分复制

数据部分复制

从2.8版本开始,slave与master能够在网络连接断开重连后只进行部分数据复制。

master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和它所有的

slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master

继续进行未完成的复制,从所记录的数据下标开始。如果master进程id变化了,或者从节点数据下标

offset太旧,已经不在master的缓存队列里了,那么将会进行一次全量数据的复制。

从2.8版本开始,redis改用可以支持部分数据复制的命令PSYNC去master同步数据

主从复制(全量复制)流程图:

主从复制(部分复制)流程图

Redis哨兵高可用架构

sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点

哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,

当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)

redis哨兵架构搭建步骤:

  • 复制一份sentinel.conf文件
    • cp sentinel.conf sentinel‐26379.conf
  • 将相关配置修改为如下值:
    • port 26379
    • daemonize yes
    • pidfile “/var/run/redis‐sentinel‐26379.pid”
    • logfile “26379.log”
    • dir “/usr/local/redis‐5.0.3/data” # sentinel monitor <master‐name> <redis‐port> # quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 +1),master才算真正失效
    • sentinel monitor mymaster 127.0.0.1 6379 2
  • 启动sentinel哨兵实例
    • src/redis‐sentinel sentinel‐26379.conf
  • 查看sentinel的info信息
    • src/redis‐cli ‐p 26379
    • 127.0.0.1:26379>info
    • 可以看到Sentinel的info里已经识别出了redis的主从
  • 可以自己再配置两个sentinel,端口26380和26381,注意上述配置文件里的对应数字都要修改

哨兵的Jedis连接代码

哨兵的spring boot 整合redis连接代码

StringRedisTemplate与RedisTemplate

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。在

RedisTemplate中提供了几个常用的接口方法的使用,分别是:

RedisTemplate中定义了对5种数据结构操作

StringRedisTemplate继承自RedisTemplate,也一样拥有上面这些操作。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存

的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

Redis客户端命令对应的RedisTemplate中的方法列表:

本文由作者按照 CC BY 4.0 进行授权