
本文共 4878 字,大约阅读时间需要 16 分钟。
一、Redis发布订阅
1、什么是发布订阅
Redis发布订阅(pub/sub)是一种消息通信模式
:发送者(pub)发送消息,订阅(sub)接受消息。比如:微信、微博、关注系统
Redis客户端可以订阅任何数量的频道(如你可以关注任何的频道、up主等)
订阅/发布消息模式图:
下面展示了频道channel1,以及订阅了这个频道的三个客户端 — client2、client5 和 client 1之间的关系:
当有新消息通过PUBLISH 命令发送到频道 channel1 时,这个消息就会被发送给订阅它的三个客户端:
2、命令
这些命令被广泛使用于构建及时通信应用,比如网络聊天室(chatroom)和实时广播、实时提醒等。
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的订阅链表中。
通过PUBLSH命令向订阅者发送消息,redis-server会使用给定的频道作为主键,在它所维护的频道字典中查询记录了订阅这个频道的所有客户端,遍历这个链表,将消息队列给所有订阅者。
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
主从复制,读写分离
:减缓服务器压力
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
查看进程信息
3、一主二从
默认情况下,每台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
真实的主从配置应该在配置文件中配置,这样子才是永久的,
以上是使用的命令
,是暂时的
。
4、细节
-
主机
可以写操作
,从机
不可以写操作,只能读操作
-
主机中的所有信息和数据,都会自动被从机保存
主机写操作:
从机读操作:从机不能写操作
测试:
主机断开连接后,从机依然连接到主机的,但是没有写操作;这时,如果主机回来了,从机依然可以直接获取到主机的写信息
如果是使用命令行配置
的主从,从机重启了就会变回主机;从机断开了再连也是可以重新获取到主机数据的
5、复制原理
Slave(从机)启动成功,连接到master(主机)后,会发送一个sync命令同步
Master接到命令后,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步(全量复制)。
- 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
- 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master
,一次完全同步(全量复制
)将被自动执行
。
我们的数据一定可以在从机中看到!
6、层层链路
上一个M连接下一个S
这时也可以完成主从复制
7、如果中途老大没了?
谋权篡位
这时能不能选一个新老大出来呢?在没哨兵模式前,需手动
SLAVEOF no one
如果主机断开连接,可以使用SLAVEOF no one
使从机变成主机!其他的节点就可以手动连接到最新的主节点(手动)
如果之前断开的主机回来了,那就只能重新连接配置(光杆司令)
感谢狂神
https://www.bilibili.com/video/BV1S54y1R7SB
发表评论
最新留言
关于作者
