Day159.Redis发布订阅、Redis主从复制(手动版) -Redis
发布日期:2021-05-07 01:39:46 浏览次数:24 分类:精选文章

本文共 4878 字,大约阅读时间需要 16 分钟。

一、Redis发布订阅

1、什么是发布订阅

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅(sub)接受消息。比如:微信、微博、关注系统

Redis客户端可以订阅任何数量的频道(如你可以关注任何的频道、up主等)

订阅/发布消息模式图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-924q8aBX-1610284985363)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210109210947914.png)]

下面展示了频道channel1,以及订阅了这个频道的三个客户端 — client2、client5 和 client 1之间的关系:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYVgWteX-1610284985366)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110174600216.png)]

当有新消息通过PUBLISH 命令发送到频道 channel1 时,这个消息就会被发送给订阅它的三个客户端:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-usGRSDrw-1610284985368)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110174928698.png)]

2、命令

这些命令被广泛使用于构建及时通信应用,比如网络聊天室(chatroom)和实时广播、实时提醒等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uy9oyjcb-1610284985372)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110175329424.png)]

3、测试

订阅端

127.0.0.1:6379> SUBSCRIBE achang # 订阅一个频道 achangReading messages... (press Ctrl-C to quit)1) "subscribe"2) "achang"3) (integer) 1# 等待读取推送信息,只要有发送端发送消息1) "message" # 接收的什么东西,消息2) "achang" # 消息来自于哪个频道3) "hello,achang" # 消息的内容1) "message"2) "achang"3) "hello,redis"

发送端

127.0.0.1:6379> PUBLISH achang "hello,achang" # 发布者发布消息到频道(integer) 1127.0.0.1:6379> PUBLISH achang hello,redis # 发布者发布消息到频道(integer) 1

4、原理

Redis是使用C实现的,通过分析 Redis 源码里的 pubsub.c 文件 , 了解发布和订阅机制的底层实现,籍此加深对 Redis 的理解。

Redis通过 PUBLISH、SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能

通过SUBSCRIBE 命令订阅某频道后,redis-server里维护了一个字典,字典的键就是一个个频道,而字典的值则是一个链表,链表中保存了所有订阅频道的客户端。SUBSCRIBE 命令的关键,就是将客户端添加到 给定channel的订阅链表中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KCFLaDJm-1610284985376)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110184551673.png)]

通过PUBLSH命令向订阅者发送消息,redis-server会使用给定的频道作为主键,在它所维护的频道字典中查询记录了订阅这个频道的所有客户端,遍历这个链表,将消息队列给所有订阅者。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBiVpYe0-1610284985378)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110184654182.png)]

Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定 对某个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到响相应的消息。这一功能的最明显用法就是用作实战时消息系统,比如普通的即时聊天,群聊等功能。

简单场景

1、实时消息系统

2、实时聊天(频道当做聊天室,将信息回显给所有人)

3、订阅,关注系统

复杂场景

使用消息中间件 MQ(rabbitMQ、Kakfa)

.

二、Redis主从复制(手动版)

1、概念

  • 主从复制,是指将一台Redis服务器的数据赋值到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower)

  • 数据的复制是单向的,只能由主节点到从节点Master以写为主,Slave以读为主

  • 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或者没有从节点),但一个从节点只有有一个主节点

亲爹(主节点)只有一个,儿子(`从节点)可以有多个

主从复制的作用主要包括:【面试题】

1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余

3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担负载,可以大大提高Redis服务器的并发量。

4、高可用(集群)基石:主从复制还是哨兵和集群能够实施的基础,因此Redis是高可用的基础

工程项目使用单台Redis服务器的缺点

1、从结构上,单个Redis服务器会发送单点故障,并且一台服务器需要处理所有的请求负载,压力较大

2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,单个Redis最大使用内存不应该超过20G

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yjrw0Mi3-1610284985379)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110191009589.png)]

主从复制,读写分离:减缓服务器压力

80%的操作都是进行读操作

在公司中,主从复制就是必须要使用的,因为在真实的项目中不可以单机使用Redis

2、环境配置

通过开启多个redis进程,来模拟伪集群操作

只配置从库,不用配置主库

127.0.0.1:6379> info replication # 查看当前库的信息# Replicationrole:master # 角色 masterconnected_slaves:0 # 没有从机master_replid:56d1281ff094ce3b78d15dc9269de04bd50c72a2master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0

复制三个配置文件,供模拟的三个伪Redis服务器使用启动,效果对应的信息

避免名字重复冲突

1、端口号

2、pid名字

3、log文件名字

4、dump.rdb名字

修改完毕后启动3个redis服务,可以通过ps -ef|grep redis查看进程信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7GADZ22-1610284985380)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110195130750.png)]

3、一主二从

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fodCVRoB-1610284985382)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110211225921.png)]

默认情况下,每台Redis都是主节点:一般情况下只要配置从机即可

一主(79)二从(80、81)

SLAVEOF IP PORT
#在从机中查看↓↓↓127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 # SLAVEOF host 6379 找谁当自己的老大OK127.0.0.1:6380> info replication# Replicationrole:slave	# 当前角色 是从机master_host:127.0.0.1 # 可以看到主角的信息master_port:6379master_link_status:upmaster_last_io_seconds_ago:2master_sync_in_progress:0slave_repl_offset:14slave_priority:100slave_read_only:1connected_slaves:0master_replid:abbb6d6c44ec184b00cae83fb8c912dd86ec9534master_replid2:0000000000000000000000000000000000000000master_repl_offset:14second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:14#在主机中查看↓↓↓127.0.0.1:6379> info replication# Replicationrole:master # 角色 主机connected_slaves:1 # 多了从机的配置slave0:ip=127.0.0.1,port=6380,state=online,offset=56,lag=0 # 从机的信息master_replid:abbb6d6c44ec184b00cae83fb8c912dd86ec9534master_replid2:0000000000000000000000000000000000000000master_repl_offset:56second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:56

如果两个都配置完了,就是有两个从机

127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:2 # 从机数量slave0:ip=127.0.0.1,port=6380,state=online,offset=462,lag=1slave1:ip=127.0.0.1,port=6381,state=online,offset=462,lag=1master_replid:abbb6d6c44ec184b00cae83fb8c912dd86ec9534master_replid2:0000000000000000000000000000000000000000master_repl_offset:462second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:462

真实的主从配置应该在配置文件中配置,这样子才是永久的

以上是使用的命令是暂时的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nj3DnMEp-1610284985384)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110203023762.png)]

4、细节

  • 主机可以写操作从机不可以写操作,只能读操作

  • 主机中的所有信息和数据,都会自动被从机保存

主机写操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Houo30ei-1610284985386)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110203629475.png)]

从机读操作:从机不能写操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0Oio2FT-1610284985387)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110203658761.png)]

测试

主机断开连接后,从机依然连接到主机的,但是没有写操作;这时,如果主机回来了,从机依然可以直接获取到主机的写信息

如果是使用命令行配置的主从,从机重启了就会变回主机;从机断开了再连也是可以重新获取到主机数据的

5、复制原理

Slave(从机)启动成功,连接到master(主机)后,会发送一个sync命令同步

Master接到命令后,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave并完成一次完全同步(全量复制)

  • 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

我们的数据一定可以在从机中看到!

6、层层链路

上一个M连接下一个S

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7KfVd15-1610284985388)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210110211102339.png)]

这时也可以完成主从复制

7、如果中途老大没了?

谋权篡位

这时能不能选一个新老大出来呢?在没哨兵模式前,需手动

SLAVEOF no one

如果主机断开连接,可以使用SLAVEOF no one 使从机变成主机!其他的节点就可以手动连接到最新的主节点(手动)

如果之前断开的主机回来了,那就只能重新连接配置(光杆司令)

感谢狂神

https://www.bilibili.com/video/BV1S54y1R7SB

上一篇:Day160.哨兵模式、缓存穿透与雪崩 -Redis
下一篇:Day158.Redis.conf、Redis持久化 -Redis

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月02日 01时01分31秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章