第127天学习打卡(Redis 发布与订阅 主从复制 一主二从)

本文介绍了Redis的发布订阅功能,包括其工作原理、命令使用和常见应用场景。此外,还详细阐述了Redis主从复制的概念、作用以及配置过程,强调了主从复制在数据冗余、故障恢复和负载均衡中的重要性。最后,提到了主从复制在实际项目中的必要性和配置注意事项。
摘要由CSDN通过智能技术生成

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.

电商网站上的商品,一般都是一次上传,无数次浏览的,“多读少些”。

image-20210515165559223

主从复制,读写分离!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

image-20210515185104817

复制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

image-20210515190440459

image-20210515190641393

然后点击esc键之后,点击:wq保存退出。

image-20210515191035719

image-20210515191221993

image-20210515191318066

然后点击esc键之后,点击:wq保存退出。

image-20210515191511124

image-20210515191620225

image-20210515191723985

image-20210515191831542

然后点击esc键之后,点击:wq保存退出。

分别开启三个配置文件:

image-20210515192722379

image-20210515192751511

image-20210515192819009

修改完毕之后,启动我们的3个redis服务器,可以通过进程信息查询。

image-20210515192920355

一主二从

默认情况下,每台Redis服务器都是主节点

image-20210515193648662

image-20210515193859890

image-20210515194029508

我们一般情况下只用配置从机就好了!

类似于认老大: 一主(79)二从(80, 81)

image-20210515194632624

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> 

在主机中可以查看到从机的信息:

image-20210515194836612

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这个从机:

image-20210515195149604

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

image-20210515195302733

真实的主从配置应该是在配置文件中配置的,这样的话是永久的,我们这里使用的是命令,是暂时的。

这里是在配置文件里面进行的配置:把#去掉进行配置

image-20210515195949835

细节

主机可以写,从机不能写只能读!主机中的所有信息和数据,都会被从机保存。

主机写:

image-20210515201609260

从机只能读不能写:

image-20210515201638897

测试:当主机断开连接时,从机依旧连接到主机,但是没有写操作了。这个时候,主机如果回来了,从机依旧可以直接获取到主机的信息。

image-20210515201935860

image-20210515202037248

查看从机 的配置没有改变:

image-20210515202114700

测试:断开从机

image-20210515202928902

查看主机,从机只剩一个了

image-20210515203059712

如果是使用命令行,来配置的主从,这个时候如果重新启动从机,从机就变回了主机。

image-20210515203432044

如果81从机重新变成从机,那么主机79里面设置的值,从机可以获取!

复制原理:

Slave启动成功连接到master后会发送一个sync同步命令

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

全量复制:而slave服务在接收到数据库文件后,将其存盘并加载到内存中。

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步

但是只要重新连接master,一次完全同步(全量复制)将被自动执行。我们的数据一定可以在从机中看到。

层层链路

上一个M连接到下一个S,中间的80即当79的从节点又当81的主节点,79写入的值,80,81都可以获取到。

image-20210515210023768

如果没有老大了,这个时候能不能选择一个老大出来呢? 手动设置

如果主机断开了连接,我们可以使用下面这个命令使自己变成主机!其他节点就可以手动连接到最新的这个主节点(手动)

slaveof no one

image-20210515210503855

如果这个时候老大恢复连接了,那就重新连接。

B站学习网址:【狂神说Java】Redis最新超详细版教程通俗易懂_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值