Redis 主从架构
Redis主从架构
redis主从架构
Redis主从工作原理
如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个SYNC(在redis2.8版本之前)命令给master请求复制数据
master收到SYNC命令后,
- 会在后台进行数据持久化通过bgsave生成最新的rdb快照文件,
- 持久化期间,master会继续接受客户端的请求,它会把这些请求缓存在内存中,
- 当持久化进行完毕之后,master会把这份rdb文件数据集发给slave,
- slave会把接收到的数据进行持久化生成rdb,然后在加载到内存中,
- 然后,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中的方法列表:
















