Redis发布订阅
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis客户端可以订阅任意数量的频道。
订阅/发布消息图:
第一个:消息发送者 第二个:频道 第三个: 消息订阅者
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayQQpc77-1621084603533)(https://gitee.com/doudoutj111/tj/raw/master/img/image-20210515154159048.png)]
下图展示了频道channel1,以及订阅这个频道的三个客户端—client2 、 client5 、client1之间的关系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opXcKFUE-1621084603535)(https://gitee.com/doudoutj111/tj/raw/master/img/image-20210515154630190.png)]
当有新消息通过publish命令发送给频道channel1时,这个消息就会被发送给订阅它的三个客户端:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-npWAD15Q-1621084603536)(https://gitee.com/doudoutj111/tj/raw/master/img/image-20210515154804014.png)]
命令
这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播、实时提醒等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5cHlVj1-1621084603537)(https://gitee.com/doudoutj111/tj/raw/master/img/image-20210515155019361.png)]
测试
订阅端: 注意(如果取消了订阅端 那么发布端发送的消息 订阅端就接收不到)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNnVAeke-1621084603539)(https://gitee.com/doudoutj111/tj/raw/master/img/image-20210515161348586.png)]
127.0.0.1:6379> subscribe kuangshenshuo #订阅一个频道kuangshenshuo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "kuangshenshuo"
3) (integer) 1
#等待读取推送的消息
1) "message" # 消息
2) "kuangshenshuo" #哪个频道的消息
3) "hello,kuangshen"#消息的具体内容
1) "message"
2) "kuangshenshuo"
3) "hello,redis"
发送端:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzKN7cI4-1621084603540)(https://gitee.com/doudoutj111/tj/raw/master/img/image-20210515161306249.png)]
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> publish kuangshenshuo "hello,kuangshen" #发布者发布消息到频道
(integer) 1
127.0.0.1:6379> publish kuangshenshuo "hello,redis"#发布者发布消息到频道
(integer) 1
原理
Redis是使用C实现的,通过分析Redis源码里的pubsub.c文件,了解发布和订阅机制的底层实现,借此加深对Redis的理解。
Redis通过PUBLISH、SUBSCRIBE和PSUBSCRIBE等命令实现发布和订阅功能。
通过SUBSCRIBE命令订阅某个频道后,redis-server里维护了一个字典,字典的键就是一个个channel,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。SUNSCRIBE命令的关键,就是将客户端添加到给定channel的订阅链表中。
通过PUBLISH命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。
Pub/Sub从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值是哪个进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。
使用场景:
1.实时消息系统
2.实时聊天(频道当做聊天室,将信息回显给所有人即可!)
3.订阅,关注系统都是可以的!
稍微复杂的场景我们就会使用消息中间件MQ
Redis主从复制
概念
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower), 数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)。
默认情况下,每台Redis服务器都是主节点,一个主节点可以有多个个或者没有从节点,但每个从节点只能由一个主节点。
主从复制的作用主要包括:
1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余的方式。
2.故障恢复:当主节点故障时,从节点可以暂时替代主节点提供服务,是一种服务冗余的方式
3.负载均衡:在主从复制的基础上,配合读写分离,由主节点提供写操作,从节点进行读操作,分担服务器的负载;尤其是在多读少写的场景下,通过多个从节点分担负载,提高并发量。
4.高可用(集群)基石:主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(会宕机),原因如下:
1.从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
2.从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G.
电商网站上的商品,一般都是一次上传,无数次浏览的,“多读少些”。
主从复制,读写分离!80%的情况下都是在进行读操作!减缓服务器的压力!架构中经常使用!最低为一主二从。
只要在公司中,主从复制就是必须要使用的,因为在真实的项目中不可能单机使用Redis!
环境配置
只配置从库,不用配置主库!
注意:在后面的时候又必须连接服务器之后info replication才能用 ,所以应该是连接上才能用这个命令吧,如果连接上用不了,那就不连接
注意:这个信息只在redis开启但不连接的时候才可以查看到 ,然后要关闭机器的前提是要连接上了云服务器才能关闭,不然的 话使用 shutdown exit这个两个命令会把阿里云的服务器关掉, Xshell就连接不上阿里云了
[root@kuangshen bin]# redis-server kconfig2/redis.conf
[root@kuangshen bin]# redis-cli -p 6379
127.0.0.1:6379> info replication #查看当前库的信息
# Replication
role:master #角色
connected_slaves:0 #没有从机
master_failover_state:no-failover
master_replid:006c251c3c62224d7c1a4259ac572337dd914423
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
然后把机器关闭:
127.0.0.1:6379> shutdown
not connected> exit
复制3个配置文件,然后修改对应的信息
1.port 端口 :进程占用的端口号
2.pid(port ID)名字:记录了进程的ID,文件带有锁,可以防止程序的多次启动。
3.log文件名字 logfile:明确日志文件的位置
4.dump.rdb名字 :持久化文件
[root@kuangshen bin]# cd kconfig2/
[root@kuangshen kconfig2]# ls
redis.conf
[root@kuangshen kconfig2]# cp redis.conf redis79.conf
[root@kuangshen kconfig2]# cp redis.conf redis80.conf
[root@kuangshen kconfig2]# cp redis.conf redis81.conf
[root@kuangshen kconfig2]# ls
redis79.conf redis80.conf redis81.conf redis.conf
[root@kuangshen kconfig2]# clear
修改三个redis.conf文件 79 80 81。
#修改三个配置文件
[root@kuangshen kconfig2]# vim redis79.conf
[root@kuangshen kconfig2]# vim redis80.conf
[root@kuangshen kconfig2]# vim redis81.conf
然后点击esc键之后,点击:wq保存退出。
然后点击esc键之后,点击:wq保存退出。
然后点击esc键之后,点击:wq保存退出。
分别开启三个配置文件:
修改完毕之后,启动我们的3个redis服务器,可以通过进程信息查询。
一主二从
默认情况下,每台Redis服务器都是主节点
我们一般情况下只用配置从机就好了!
类似于认老大: 一主(79)二从(80, 81)
127.0.0.1:6380> slaveof 127.0.0.1 6379 #slaveof host port找谁当自己的老大
OK
127.0.0.1:6380> info replication
# Replication
role:slave # 当前主机是从机
master_host:127.0.0.1 #可以看到主机的信息
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:28
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:66db1fe6791174b20cba2581692161d8286adf66
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
127.0.0.1:6380>
在主机中可以查看到从机的信息:
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1 #多了从机的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=84,lag=1
master_failover_state:no-failover
master_replid:66db1fe6791174b20cba2581692161d8286adf66
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
配置81这个从机:
如果两个都配置完了,就是有两个从机
真实的主从配置应该是在配置文件中配置的,这样的话是永久的,我们这里使用的是命令,是暂时的。
这里是在配置文件里面进行的配置:把#去掉进行配置
细节
主机可以写,从机不能写只能读!主机中的所有信息和数据,都会被从机保存。
主机写:
从机只能读不能写:
测试:当主机断开连接时,从机依旧连接到主机,但是没有写操作了。这个时候,主机如果回来了,从机依旧可以直接获取到主机的信息。
查看从机 的配置没有改变:
测试:断开从机:
查看主机,从机只剩一个了
如果是使用命令行,来配置的主从,这个时候如果重新启动从机,从机就变回了主机。
如果81从机重新变成从机,那么主机79里面设置的值,从机可以获取!
复制原理:
Slave启动成功连接到master后会发送一个sync同步命令
Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,并完成一次完全同步。
全量复制:而slave服务在接收到数据库文件后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要重新连接master,一次完全同步(全量复制)将被自动执行。我们的数据一定可以在从机中看到。
层层链路
上一个M连接到下一个S,中间的80即当79的从节点又当81的主节点,79写入的值,80,81都可以获取到。
如果没有老大了,这个时候能不能选择一个老大出来呢? 手动设置
如果主机断开了连接,我们可以使用下面这个命令使自己变成主机!其他节点就可以手动连接到最新的这个主节点(手动)
slaveof no one
如果这个时候老大恢复连接了,那就重新连接。