Redis原理简述及发布订阅消息队列
目录
1 什么是Redis
2 Redis 非阻塞IO内部原理
2.1 IO多路复用策略
2.2 Reactor设计模式
3 基于PubSub的消息队列(发布-订阅)
由于集群之后存在多台服务器,并且不同客户端连接的可能是不同的服务器,因此在聊天过程中涉及到服务器之间的通信。
如果单纯的将各服务器之间建立TCP连接进行通信,相当于在服务器网络之间进行广播,会造成各服务器之间耦合度太高、业务实现复杂、应对故障能力差,不利于系统扩展,并且会占用系统大量的socket资源,各服务器之间的带宽压力太大,不能够节省资源给更多的客户端提供服务。
集群部署的服务器之间进行通信,最好的方式就是引入中间件消息队列,解耦各个服务器,使得整个系统松耦合,提高服务器的响应能力,节省服务器的带宽资源:

在集群分布式环境下,常用的中间件消息队列有ActiveMQ、RabbitMQ、Kafka等,redis属于比较轻量级的中间件。
1 什么是Redis

全称是Remote Dictionary Server(远程字典服务器),是一个开源的高性能键值对(key-value)存储系统。Redis具有以下特点来支持其高并发、分布式高性能的特性:
- 数据库保存在内存中:仅使用磁盘进行持久化,具有快速读写的高性能,数据存储在内存中,类似于HashMap,使得数据的查找和操作时间复杂度为O(1)。Redis支持将数据持久化到硬盘上,以防止数据丢失。它提供了两种持久化方式:RDB(Redis Database)和AOF(Append Only File)。RDB是将数据定期保存到磁盘文件中,而AOF则是将每个写操作追加到文件的末尾。
- 基于字典结构存储:Redis的底层存储结构主要依赖于字典,也称为散列表(hash)。字典是一种键值对的存储结构,用于在内存中快速查找和访问数据。整个Redis数据库就是通过字典来存储数据的,每个键值对都被存储在字典中。因此,在对Redis进行CURD操作时,实际上是对字典中的数据进行操作。
- 支持多种数据结构:不仅仅支持简单的key-value类型的数据,还提供了list、set、zset和hash等更复杂的数据结构的存储。
- 支持数据备份:可以通过master-slave模式进行数据备份,增加了数据的可靠性和安全性。
- 单线程模型:它在任何给定的时间只处理一条命令,这样可以避免了多线程之间的线程同步和竞争条件问题。但是,可以通过异步I/O和事件驱动模型来提高并发读写的能力,从而实现了高性能的读写操作。
- 非阻塞IO:Redis使用多路复用IO模型来处理IO操作,实现了非阻塞IO。它通过监听多个socket,一次性接受多个客户端请求,并将请求放入队列中。当完整的命令到达服务端后,再去处理请求,不需要等待客户端的传输。这种方式可以提高Redis的并发处理能力。
基于以上特性,Redis在多种应用场景使用:
- 发布订阅系统:Redis提供了发布订阅(Pub/Sub)机制,可以用于实现消息队列、实时聊天等功能。通过订阅感兴趣的频道,客户端可以接收到相应的消息。
- 地图信息分析:Redis提供了地理位置相关的数据结构和命令,可以用于存储和查询地理位置信息。这使得它在地图信息分析方面具有很大的优势。
- 计时器和计数器:Redis提供了丰富的命令,可以用于实现计时器和计数器功能,比如记录用户的浏览量、点赞次数等。
- 分布式锁:Redis的setnx命令可以用于实现分布式锁。在分布式应用中,为了保证同一时刻只有一个线程执行关键代码,可以使用Redis的分布式锁功能来实现。
- 实时数据分析:由于Redis具有高性能和低延迟的特点,适合用于实时数据分析。可以将实时产生的数据存储在Redis中,并通过Redis提供的相关命令进行实时的数据查询和统计分析。
2 Redis 非阻塞IO内部原理
Redis内部实现采用epoll+Reactor 设计模式。 epoll中的读、写、关闭、连接都转化成了事件,利用epoll的多路复用特性结合事件驱动提高网络性能。
Redis的实现模式类似于muduo库,都是使用epoll+Reactor。因为 Redis 需要在多个平台上运行,同时为了最大化执行的效率与性能,所以会根据编译平台的不同选择不同的 I/O 多路复用函数作为子模块,提供给上层统一的接口。
2.1 IO多路复用策略
redis的多路复用, 提供了select, epoll, evport, kqueue几种选择,在编译的时候来选择一种。
select是POSIX提供的, 一般的操作系统都有支撑;
epoll 是LINUX系统内核提供支持的;
evport是Solaris系统内核提供支持的;
kqueue是Mac 系统提供支持的;
为了将所有 IO 复用统一,Redis 为所有 IO 复用统一了类型名 aeApiState,对于 epoll 而言,类型成员就是调用 epoll_wait所需要的参数
接下来就是一些对epoll接口的封装了:
包括创建 epoll(epoll_create)
注册事件(epoll_ctl)
删除事件(epoll_ctl)
阻塞监听(epoll_wait)等
创建 epoll 就是简单的为 aeApiState 申请内存空间,然后将返回的指针保存在事件驱动循环中,注册事件和删除事件就是对 epoll_ctl 的封装,根据操作不同选择不同的参数,阻塞监听是对 epoll_wait 的封装,在返回后将激活的事件保存在事件驱动中。
2.2 Reactor设计模式
Redis 服务采用 Reactor 的方式来实现文件事件处理器(每一个网络连接其实都对应一个文件描述符)
当 main 函数初始化工作完成后,就需要进行事件驱动循环,而在循环中,会调用 IO 复用函数进行监听在初始化完成后,main 函数调用了 aeMain 函数,传入的参数就是服务器的事件驱动
Redis 对于时间事件是采用链表的形式记录的,这导致每次寻找最早超时的那个事件都需要遍历整个链表,容易造成性能瓶颈。而 libevent 是采用最小堆记录时间事件,寻找最早超时事件只需要 O(1) 的复杂度。
通过Reactor的方式,可以将用户线程轮询IO操作状态的工作统一交给handle_events事件循环进行处理。
用户线程注册事件处理器之后可以继续执行做其他的工作(异步),而Reactor线程负责调用内核的select/epoll函数检查socket状态。当有socket被激活时,则通知相应的用户线程(或执行用户线程的回调函数),执行handle_event进行数据读取、处理的工作。由于select/epoll函数是阻塞的,因此多路IO复用模型也被称为异步阻塞IO模型。注意,这里的所说的阻塞是指select函数执行时线程被阻塞,而不是指socket。一般在使用IO多路复用模型时,socket都是设置为NONBLOCK的,不过这并不会产生影响,因为用户发起IO请求时,数据已经到达了,用户线程一定不会被阻塞。
3 基于PubSub的消息队列(发布-订阅)
发布订阅模式是一种消息传递模式,其中发布者发送消息而不直接指定接收者,订阅者通过注册感兴趣的主题来接收消息。当发布者发布某个主题的消息时,所有订阅该主题的消费者都会收到该消息。这种模式有效地实现了解耦,使得生产者和消费者之间的交互更加灵活,常用于事件驱动架构和消息队列系统中。
发布/订阅模式可以 1:N 的消息发布/订阅。发布者将消息发布到指定的频道频道(channel),订阅相应频道的客户端都能收到消息。
PubSub(发布订阅)是Redis2.0版本引入的消息传递模型。

优缺点:
优点:
实时性:Pub/Sub 模式允许消息的即时传递,订阅者能够快速接收到发布者发送的消息,适合需要快速响应的应用场景,如实时聊天、在线游戏等。
解耦合:发布者和订阅者之间是松耦合的,发布者无需知道订阅者的存在,增强了系统的灵活性和可扩展性。
多频道支持:可以同时订阅多个频道,允许订阅者接收来自不同频道的消息。
缺点:
消息丢失:如果在发布消息时没有任何订阅者在线,消息将被丢弃,无法持久化。这意味着在网络故障或 Redis 宕机时,消息会丢失。
缺乏确认机制:Pub/Sub 模式没有消息确认机制,无法保证消息是否被成功接收和处理。这可能导致消费者在处理消息时出现问题而无法重试。
性能压力:当订阅者数量较多时,发布大量消息可能会对 Redis 服务器造成较大负担,影响系统性能。
常用命令:
| 命令 | 用法 | 描述 |
| SUBSCRIBE |
| 订阅一个或多个频道,以接收该频道的消息。 |
| UNSUBSCRIBE |
| 取消对一个或多个频道的订阅。 |
| PUBLISH |
| 向指定的频道发布消息。 |
| PSUBSCRIBE |
| 订阅符合特定模式的频道(支持通配符,如 )。 |
| PUNSUBSCRIBE |
| 取消对符合特定模式的频道的订阅。 |
| PUBSUB |
| 查看当前订阅的活跃频道。 |
|
| 返回指定频道的订阅者数量。 | |
|
| 返回当前通过模式订阅(PSUBSCRIBE)的数量。 |
说明:
支持通配符的命令:PSUBSCRIBE 和 PUNSUBSCRIBE 使用通配符(如 news.*)匹配频道名。
PUBSUB 子命令:
CHANNELS:列出当前活跃的频道。
NUMSUB:查询指定频道的订阅者数量。
NUMPAT:统计模式订阅的数量。
注意:UNSUBSCRIBE 和 PUNSUBSCRIBE 若不指定参数,默认取消所有订阅。
相关文章:
Redis原理简述及发布订阅消息队列
目录 1 什么是Redis 2 Redis 非阻塞IO内部原理 2.1 IO多路复用策略 2.2 Reactor设计模式 3 基于PubSub的消息队列(发布-订阅) 由于集群之后存在多台服务器,并且不同客户端连接的可能是不同的服务器,因此在聊天过程中涉及到服…...
ThreadLocal为什么会内存溢出
每个线程(Thread 对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有 ThreadLocal 变量的键值对: ThreadLocalMap虽然是ThreadLocal的静态内部类,但是Thread 对象的属性,当线程存活时ThreadLocalMap不会被回收。 Key:ThreadLocal 实例的 弱引用(WeakReference)。…...
假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?
前言:本篇文章解释了接口学习过程中的2个常见问题,一个是“为什么是类在使用接口”,另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”,旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…...
数据结构——Makefile、算法、排序(2025.2.13)
目录 一、Makefile 1.功能 2.基本语法和相关操作 (1)创建Makefile文件 (2)编译规则 (3)编译 (4)变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 ÿ…...
算法之 跳跃游戏
文章目录 55.跳跃游戏思路参考:56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析: 两种思路,思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr,如果i>mr就说明无法到达i,否则就是可以到达;…...
C#中的图形渲染模式
在C#中,图形模式通常用于定义如何渲染或处理图形。可以枚举定义如下四种图形模式:AUTO、GDI、DIB 和 FBO。这些模式可能用于指定不同的图形渲染技术或后端。下面是对这些模式的详细解释: 1. AUTO (自动模式) 含义:自动选择最适合…...
二.数据治理流程架构
1、数据治理流程架构核心思想: 该图描绘了一个以数据标准规范体系为核心,大数据生命周期管理为主线,数据资源中心为依托,并辅以数据质量管理和大数据安全与隐私管理的数据治理流程架构。它旨在通过规范化的流程和技术手段&#x…...
瑞萨RA-T系列芯片ADCGPT功能模块的配合使用
在马达或电源工程中,往往需要采集多路AD信号,且这些信号的优先级和采样时机不相同。本篇介绍在使用RA-T系列芯片建立马达或电源工程时,如何根据需求来设置主要功能模块ADC&GPT,包括采样通道打包和分组,GPT触发启动…...
扩散模型中的马尔可夫链设计演进:从DDPM到Stable Diffusion全解析
一、技术原理与数学推导(附核心公式) 1.1 扩散过程数学建模 马尔可夫链前向过程定义: q(x_{1:T}|x_0) \prod_{t1}^T q(x_t|x_{t-1})噪声调度函数(以余弦调度为例): \beta_t \frac{1 - \cos(\pi t/T)}…...
通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!
欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中,你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码,但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释: 一、数字含义&…...
大模型常识:什么是大模型/大语言模型/LLM
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、什么是语言模型? 那么什么是语言模…...
iOS 中使用 FFmpeg 进行音视频处理
在 iOS 中使用 FFmpeg 进行音视频处理,通常需要将 FFmpeg 的功能集成到项目中。由于 FFmpeg 是一个 C 库,直接在 iOS 中使用需要进行一些配置和封装。 1. 在 iOS 项目中集成 FFmpeg 方法 1:使用 FFmpeg 预编译库 下载 FFmpeg iOS 预编译库: 可以从以下项目中获取预编译的 …...
SAP-ABAP:SAP的Screen Layout Designer屏幕布局设计器详解及示例
在SAP中,Screen Layout Designer(屏幕布局设计器)是用于设计和维护屏幕(Dynpro)布局的工具。通过Screen Layout Designer,您可以创建和修改屏幕元素(如输入字段、按钮、文本、表格控件等&#x…...
一.数据治理理论架构
1、数据治理核心思想: 数据治理理论架构图描绘了一个由顶层设计、管控机制、核心领域和管理系统四个主要部分组成的数据治理框架。它旨在通过系统化的方法,解决数据治理机制缺失引发的业务和技术问题,并最终提升企业的数据管理水平。 数据治…...
亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用
文章目录 一、引言二、准备工作(Ollama 工具介绍与下载)2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…...
MySQL安装MySQL服务时提示Install-Remove of the Service Denied
文章目录 问题描述排查1.字面意思2.搜索引擎3.官方文档4.源码 处理方法相关扩展 问题描述 MySQL安装MySQL服务时提示Install-Remove of the Service Denied! 详细报错如下: C:\Users\荷塘月色>net start mysql 服务名无效。请键入 NET HELPMSG 2185 以获得更多…...
(Windows | Linux)ssh访问服务器报错:no matching key exchange method found
问题现象 ssh user1192.168.1X.XX Unable to negotiate with 192.168.1X.XX port 22: no matching key exchange method found. Their offer: gss-group1-sha1-toWM5Slw5Ew8Mqkayal2g,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-…...
Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)
安装前检查服务器glibc版本,下载对应版本包 rpm -qa | grep glibc mysql安装包及依赖包已整理好,下载地址:https://pan.quark.cn/s/3137acc814c0,下载即可安装 一、下载MySQL mysql安装包及依赖包已整理好,下载地址…...
有哪些滤波,原理是什么,分别在什么时候用
均值滤波(Average Filtering) 原理:通过计算像素点邻域内像素值的平均值来作为该像素点滤波后的新值。例如,对于一个 3x3 的邻域,将 9 个像素值相加然后除以 9 得到滤波后的像素值。优点:简单易实现&#x…...
深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符20250213
🛠️ 深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符 引言 🌟 在与 Oracle 数据库打交道的日常工作中,你是否遇到过 ORA-29275: partial multibyte character 这个令人头疼的错误?这个错误通常与字符编码、数…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
