写点什么

Day159

  • 2022 年 5 月 04 日
  • 本文字数:2252 字

    阅读完需:约 7 分钟

  1. "achang" # 消息来自于哪个频道

  2. "hello,achang" # 消息的内容

  3. "message"

  4. "achang"

  5. "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


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

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Day159_程序员_爱好编程进阶_InfoQ写作社区