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

Redis发布订阅

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis客户端可以订阅任意数量的频道。

订阅/发布消息图:

第一个:消息发送者 第二个:频道 第三个: 消息订阅者

 

下图展示了频道channel1,以及订阅这个频道的三个客户端---client2 、 client5 、client1之间的关系:

 

 

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

 

 

命令

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

 

测试

订阅端: 注意(如果取消了订阅端 那么发布端发送的消息 订阅端就接收不到)

 

 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"
 

发送端:

 

 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

posted @ 2021-05-15 21:18  豆豆tj  阅读(143)  评论(0)    收藏  举报