了解 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.mzph.cn/news/659651.shtml

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

相关文章

Linux命令-ar命令(建立或修改备存文件,或是从备存文件中抽取文件)

补充说明 ar命令 是一个建立或修改备存文件,或是从备存文件中抽取文件的工具,ar可让您集合许多文件,成 为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限. 语法 ar [-]{dmpqrtx}[abcfilNoPsSuvV] [memberna…

BioTech - 小分子药物生成与从头设计 概述

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/135930139 小分子药物生成是一种利用计算方法自动探索化学空间,寻找具有理想生物活性和药物特性的分子结构的过程。从头设计是一种特殊…

【日常总结】windows11 设置文件默认打开方式

一、场景 二、实战 Stage 1:打开设置 Stage 2:应用 > 默认应用 > 搜索 .txt Stage 3:修改成notepad ,设置默认值即可 一、场景 windows 11 .txt 默认记事本打开 需求:如何使用notepad打开呢 ?…

隧道穿越:隧道穿透技术介绍

后面会进行一些隧道穿越的实验,因此在本篇中这里先介绍一些有关隧道穿越的技术知识点 隧道和隧道穿透 隧道是一种通过互联网基础设施在网络之间传递数据的方式,设计从数据封装、传输到解包的全过程,使用隧道传递的数据(或者负载…

abap_bool 类型

abap_bool 类型 abap_bool 有两种abap_true和abap_false,abap_true代表x,abap_false是空

【Emgu CV教程】6.7、图像平滑之MedianBlur()中值滤波

文章目录 一、介绍1.原理2.函数介绍 二、举例1.原始素材2.代码3.运行结果 一、介绍 1.原理 图像的滤波分为线性滤波和非线性滤波,常见的线性滤波就是前面介绍的均值滤波、方框滤波、高斯滤波。常见的非线性滤波主要包括中值滤波、双边滤波,今天就先介绍中值滤波。…

二进制安全虚拟机Protostar靶场(5)堆的简单介绍以及实战 heap0

前言 这是一个系列文章,之前已经介绍过一些二进制安全的基础知识,这里就不过多重复提及,不熟悉的同学可以去看看我之前写的文章 什么是堆 堆是动态内存分配的区域,程序在运行时用来分配内存。它与栈不同,栈用于静态…

【PHP】在ThinkPHP 5.0中设置缓存以提高性能

在ThinkPHP 5.0中,您可以使用Cache类来设置缓存,以提高应用程序的性能。缓存可以减少对数据库的访问次数,从而提高应用程序的响应速度。 首先,确保您已经在config.php文件中启用了缓存。在config.php文件中,将cache配…

asdf安装不同版本的nodejs和yarn和pnpm

安装asdf 安装nodejs nodejs版本 目前项目中常用的是14、16和18 安装插件 asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git asdf plugin-add yarn https://github.com/twuni/asdf-yarn.git可以查看获取所有的nodejs版本 asdf list all nodejs有很多找…

【TCP】三次握手(建立连接)

前言 在网络通信的世界里,可靠传输协议(TCP)扮演着重要的角色,它保证了数据包能够按顺序、完整地从发送端传送到接收端。TCP协议中有一个至关重要的机制——三次握手。这一过程确保了两个TCP设备在开始数据传输之前建立起一个稳定…

机器的大小端存储模式

大、小端字节序 一个整形数据在内存中的存储方式是该数据的补码; 该数据本事的数据是从高地址位到低地址位的,而计算机的内存中刚好相反! 以数字10为例: 补码:0000 0000 0000 0000 0000 0000 0000 1010 补码的十六进制…

windows10设置多个jar后台开机自启

1、window10启动多个jar包的脚本 新建一个txt文档,将以下内容复制到文档中: echo off taskkill /f /im javaw.exe //停用之前启动过的所有后台javaw程序 d: //jar包所在盘符 cd saas //jar包所在文件夹 start cmd /c "title 程序…

Redis简单阐述、安装配置及远程访问

目录 一、Redis简介 1.什么是Redis 2.特点 3.优势 4.数据库对比 5.应用场景 二、 安装与配置 1.下载 2.上传解压 3.安装gcc 4.编译 5.查看安装目录 6.后端启动 7.测试 8.系统服务配置 三、Redis远程访问 1.修改访问IP地址 2.设置登录密码 3.重启Redis服务 …

Maven安装,学习笔记,详细整理maven的一些配置

Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后,我们即将开始学习后端Web开发技术。做为一名Java开发工程师,后端 Web开发技术…

算法练习01——哈希部分双指针

目录 1. 两数之和(*)242. 有效的字母异位词(easy)49. 字母异位词分组(*)349. 两个数组的交集202. 快乐数(1.使用Set存哈希,2.快慢指针)454. 四数相加 II383. 赎金信15. 三数之和*(双指针)18. 四数之和*(双指针)128. 最长连续序列 1. 两数之和(*) https://leetcode.…

Gas Hero Common Heroes NFT 概览与数据分析

作者:stellafootprint.network 编译:mingfootprint.network 数据源:Gas Hero Common Heroes NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏,强调社交互动,并与 FSL 生态系统集成…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说,直接看题: 下面为分析: 很显然,我们在整体上以s[i]为基准,先把士兵按s[i]排好。然后,我们先求s[i]大的开始,即规定选人数…

若依前后端分离集成多数据源SQL Server教程

本章教程,主要介绍如何在若依开源框架前后端分离版本中集成多数据源SQL Server教程。 目录 一、添加依赖 二、修改配置 三、修改代码 四、如何使用 一、添加依赖

asp.net 404页面配置、 asp.net MVC 配置404页面、iis 配置404页面,指定404错误页面,设置404错误页面

通过标题的三个问题 1、asp.net 404页面配置、 2、asp.net MVC 配置404页面、 3、iis 配置404页面; 可以看出,这是一篇了不得的问题,并进行全面讲解; 除了围绕以上三个核心问题外,我们也对以下2个核心场景也作出分析…