Day159
"achang" # 消息来自于哪个频道
"hello,achang" # 消息的内容
"message"
"achang"
"hello,redis"
发送端:
127.0.0.1:6379> PUBLISH achang "hello,achang" # 发布者发布消息到频道
(integer) 1
127.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 # 查看当前库的信息
Replication
role:master # 角色 master
connected_slaves:0 # 没有从机
master_replid:56d1281ff094ce3b78d15dc9269de04bd50c72a2
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
复制三个配置文件,供模拟的三个伪 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 找谁当自己的老大
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:2
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:abbb6d6c44ec184b00cae83fb8c912dd86ec9534
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
#在主机中查看↓↓↓
127.0.0.1:6379> info replication
Replication
role:master # 角色 主机
connected_slaves:1 # 多了从机的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=56,lag=0 # 从机的信息
master_replid:abbb6d6c44ec184b00cae83fb8c912dd86ec9534
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
如果两个都配置完了,就是有两个从机
评论