了解 Redis Channel:消息传递机制、发布与订阅,以及打造简易聊天室的实战应用。

文章目录

      • 1. Redis Channel 是什么
      • 2. Redis-Cli 中演示使用
      • 3. 利用 Channel 打造一个简易的聊天室
      • 参考文献

1. Redis Channel 是什么

Redis Channel 是一种消息传递机制,允许发布者向特定频道发布消息,而订阅者则通过订阅频道实时接收消息。

Redis Channel 的消息传输是通过 Redis PUB/SUB 模型实现的。发布者使用 PUBLISH 命令将消息发送到指定的频道,订阅者使用 SUBSCRIBE 命令订阅指定频道。值得注意的是,频道的主要作用是实现实时消息传递,频道信息并不存储在数据库中,而是在内存中动态生成,所以在 Redis 重启后信息将消失,如果要存储频道信息,需要引入另外的方案。

2. Redis-Cli 中演示使用

  • 订阅频道
    使用 SUBSCRIBE 命令,订阅者可以订阅感兴趣的频道,接收实时消息。例如:
    # SUBCRIBE channel1 channel2 ...
    SUBSCRIBE news
    
  • 发布消息
    通过 PUBLISH 命令,发布者可以向指定的频道发布消息。例如:
    # PUBLISH channel message
    PUBLISH news "震惊!!"
    
  • 获取所有频道
    通过 PUBSUB CHANNELS 命令,你可以获取当前被订阅的所有频道:
    PUBSUB CHANNELS
    
  • 附加
    更多的命令请参照 Redis 的 Command 文档 https://redis.io/commands/](https://redis.io/commands/

3. 利用 Channel 打造一个简易的聊天室

首先,创建一个频道用于聊天:

SUBSCRIBE chatroom1

在一个终端窗口中,使用 PUBLISH 命令发送消息:

PUBLISH chatroom1 '{"username": "u1s1", "content": "hello"}'

在另一个订阅的终端中将会接收到这个 JSON 字符串信息:

127.0.0.1:6379> SUBSCRIBE chatroom1
Reading messages... (press Ctrl-C to quit)
...
1) "message"
2) "chatroom1"
3) "{\"username\": \"y\", \"content\": \"adssd\"}"

使用 Python 来完成上面描述的需求:

import redis
import threading
import jsonclass ChatroomClient:def __init__(self, username):self.username = usernameself.redis_client = redis.StrictRedis(host='localhost', port=6379, db=0, password="password")self.channel_name = 'CHATROOM'self.lock = threading.Lock()# 启动一个子线程用于监听消息listen_thread = threading.Thread(target=self.listen_for_messages, daemon=True)listen_thread.start()# 等待用户输入self.user_publish_messages()def user_publish_messages(self):while True:msg = input("\n>>")data = {"username": self.username, "content": msg}self.redis_client.publish(self.channel_name, json.dumps(data, ensure_ascii=False))def listen_for_messages(self):pubsub = self.redis_client.pubsub()pubsub.subscribe(self.channel_name)while True:for message in pubsub.listen():if message["type"] == "message":data = json.loads(message["data"].decode("utf8"))with self.lock:print(f"\n【{data['username']}】: {data['content']}")if __name__ == "__main__":username = input("输入用户名: ")client = ChatroomClient(username)

这段代码同时实现了 “发布消息” 和 “订阅消息” 的功能:使用了一个子线程监听,当接收到消息的时候打印消息。在主线程持续等待用户输入,当用户输入后将接收到的消息以 JSON 字符串的格式发布到 Redis 中。

现在可以将上述代码复制两份,同时启动。让一个客户端的用户名为 “user1”,另一个客户端的用户名为 “user2”。在光标后发送信息。情况大致如下:
在这里插入图片描述
在图中可以看到本例在 Pycharm 中运行了 c1c2 两个客户端,在 c1 中发送了两条消息。这里需要注意,由于发送和接收信息都在一个终端中打印,所以会出现发送和接收串位的情况,无伤大雅。有需要可以自行选择别的任何方式优化。

接下来看一下 c2 的接收情况,如下图所示:
在这里插入图片描述

参考文献

Redis 指令参照 https://redis.io/commands/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/449624.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

N-142基于springboot,vue停车场管理系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatis-plus 本项目分为普通用户和管理员…

OceanBase 4.2.2 GA 发布,全新特性快速预览!

在 2023 年度发布会上,OceanBase 沿着“一体化”产品战略思路,发布了一体化数据库的首个长期支持版本 4.2.1 LTS。作为 4.0 系列的首个 LTS 版本,该版本的定位是支撑客户关键业务稳定长久运行,我们非常认真的打磨了这个版本&#…

深入理解网络编程之BIO和NIO

目录 原生JDK网络编程BIO BIO通信模型服务端代码 BIO通信模型客户端代码 伪异步模型服务端代码(客户端跟之前一致) 原生JDK网络编程NIO 什么是NIO? NIO和BIO的主要区别 阻塞与非阻塞IO NIO之Reactor模式 NIO中Reactor模式的基本组成…

数据分析基础之《pandas(4)—pandas画图》

1、DataFrame.plot(xNone, yNone, kindline) 说明: x:设置x轴标签 y:设置y轴标签 kind: line 折线图 bar 柱状图 hist 直方图 pie 饼图 scatter 散点图 # 找到p_change和turnover之间的关系 data.plot(xvolume, yturnover, kinds…

手把手教你开发Python桌面应用-PyQt6图书管理系统-主界面UI设计实现

锋哥原创的PyQt6图书管理系统视频教程: PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

随着网络的快速发展,网络安全问题也日益凸显,遇到攻击该如何处理,如何抉择合适的防护方案

DexunCloud 经过研究发现当今世界,随着网络的快速发展,网络安全问题也日益凸显。其中,DDoS(分布式拒绝服务)攻击被认为是网络安全领域里最为严重的威胁之一。毫无疑问,DDoS攻击不仅可以导致网络服务中断&am…

2024 高级前端面试题之 HTTP模块 「精选篇」

该内容主要整理关于 HTTP模块 的相关面试题,其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 HTTP模块精选篇 1. HTTP 报文的组成部分2. 常见状态码3. 从输入URL到呈现页面过程3.1 简洁3.2 详细 4. TCP、UDP相关5. HTTP2相关6. https相关7. WebSocket的…

【数据结构】单向链表实现 超详细

目录 一. 单链表的实现 1.准备工作及其注意事项 1.1 先创建三个文件 1.2 注意事项:帮助高效记忆和理解 2.链表的基本功能接口 2.0 创建一个 链表 2.1 链表的打印 3.链表的创建新节点接口 4.链表的节点插入功能接口 4.1 尾插接口 4.2 头插接口 4.3 指定位…

一文掌握单基因GSEA富集分析 | gseaGO and gseaKEGG

本期教程 本期教程原文:一文掌握单基因GSEA富集分析 | gseaGO and gseaKEGG 写在前面 关于GSEA分析,我们在前期的教程单基因GSEA富集分析 | 20220404有出过类似的分享。今天,我们也结合相关的资源整理出一篇关于GSEA的教程及出图教程。每个…

springboot整合rabbitmq,及各类型交换机详解

RabbitMQ交换机: 一.交换机的作用 如果直接发送信息给一条队列,而这一消息需要多个队列的的多个消费者共同执行,可此时只会有一个队列的一个消费者接收该消息并处理,其他队列的消费者无法获取消息并执行。所以此时就需要交换机接…

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具:安装宝塔面板服务器至少一台、域名一个 前端:生成dist文件(前端运行build命令) 后端:生成jar包(maven运行package命令) 准备: 打开宝塔面板,点击进入软…

基于springboot篮球论坛系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…