redis发布订阅与stream类型

发布订阅

redis发布订阅(pub/sub)是一种消息通信模式;发送者(pub)发送消息,订阅者(sub)接收消息。redis客户端可以订阅任意数量的频道。

基础命令:
语法

redis publish命令基本语法如下:

redis 127.0.0.1:6379> PUBLISH channel massage

redis subscribe 命令基本语法如下:

redis 127.0.0.1:6379 > subscribe channel [channel ...]

返回值

接收到信息的订阅者数量。

接收到的消息。

redis-cli
​
subscribe xx
​
​
​
redis-cli
​
publish xx "hello"
​
publish xx "reids publish subscribe"
案例
touch publish.php
​
touch subscribe.php
curl http://192.168.80.21/publish.php?message=你好
**报错需要检查的地方
systemctl stop firewalld
service nginx start
/www/server/php/sbin/php-fpm
​
curl http://192.168.80.21/publish.php?message=你好

public.php

<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
//链接了redis之后,应该需要一个权限验证,密码验证,这里没有,跳过
//$redis->auth("root");
$message = $_GET["message"];
var_dump($message);
$restful = $redis->publish("new",$message);//向频道new发送一条消息
if ($restful){echo "消息发送成功";exit;
}
echo "发送失败";

subscribe.php

<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
//$redis->auth('root');while (true){echo time();ini_set('default_socket_timeout',-1);//不超时$redis->subscribe(['new'],function ($redis,$chan,$message){echo ' chan'.$chan.'  message'.$message;var_dump($redis);sleep(1);});
}

  

广播案例

node-v16是开箱即用的,解压之后放在/www/server/node 中

vim /etc/profile
​
export NODE_HOME=/www/server/node
​
export PATH=$PATH:$NODE_HOME/bin
​
export NODE_PATH=$NODE_HOME/lib/node_modules
​
source /etc/profile
node -v
npm -v
cd /www/wwwroot
ll
cd php/
ll
cd blog/
ll
​
npm install http socket.io ioredis socket.io-client
​
npm run dev **更新js代码
node websocket **更新websocket代码
​
php artisan redis:publish

版本问题:

const {io} = require('socket.io-client');**4以上的要加{}
const io = require("socket.io-client");**4以下的不用加

Redis的Stream类型

1.削峰,减少响应时间

2.降低系统耦合性

1.Redis List类型实现

使用redis的lpush/rpop(rpush/lpop)命令简单实现左进右出或右进左出的list

列表。然后需要开启一个线程任务或者定时任务或者轮询方式,不停的调用rpop方法查看list中是否待处理消息。

2.发布/订阅

生产者和消费者通过相同的一个信道进行交互。信道其实也就是队列。通常会有多个消费者。多个消费者订阅同一个信道,当生产者向信道发布消息时,该信道会立即将消息逐一发布给每个消费者。所以该信道对于消费者是发散的信道,每个消费者都可以得到相同的消息。典型的一对多的关系。

Redis Stream主要用于消息队列(MQ,Message Queue),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。

XADD:插入消息

xread:消费消息

ack:消费之后用于验证消息是否消费成功


Stream的使用

touch Stream.php
​
redis-cli
xadd stream * massage sky 
​
xadd stream * massage york
​
xadd stream * massage cara
​
xInfo GROUPS  sky
xGroup create sky a1 0
xInfo GROUPS sky
xInfo GROUPS jifen
XReadGroup GROUP a1 aa block 0 count 1 stream sky >
xInfo GROUPS sky
xack sky a1 1642165324727-0 
<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
//$redis->auth("root");
echo "开始下单".PHP_EOL;
$order = ["id" => 1,"price" => 12000,"product_id" => 1
];
//存储订单数据,表示下单成功
$restful = $redis ->hMSet('order:'.$order["id"],$order);
//通过消息队列异步增加用户积分
if ($restful){$redis->xAdd("jifen","*",$order);
}
echo "下单成功";
<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);const xKey = "jifen";
const groupName = 'sendMail';function initGroup(){global $redis;$groups = $redis->xInfo('GROUPS',xKey);//这里我们会得到一个数组,数组中的数据就是消息队列的详细信息//因为此处需要判断队列是否有创建消费组,如果有就创建,默认为没有,下面在根据上面xinfo查询的消息来判断队列是否有消费组$exisGroups = false;if ($groups){foreach ($groups as $group){if ($group[1] === groupName){$exisGroups = true;break;}}}if ($exisGroups){//判断消费组是否已经创建,如果没有那么就使用xGroup创建消费组,并从0开始进行消费,消费组名称为groupName$redis->xGroup('create',xKey,groupName,"0");//表示从0开始消费echo "init Group:".groupName.PHP_EOL;}
}
initGroup();
while (true){$getRestful = $redis -> xReadGroup(groupName,'c1',[xKey=>'>'],1,2000);if ($getRestful && isset($getRestful[xKey])){$sendMail = $getRestful[xKey];//取出消费的消息信息foreach ($sendMail as $id =>$fieldList){$redis->xAck(xKey,groupName,[$id]);echo "sendMail with id = ".$fieldList["id"].PHP_EOL;}}usleep(5);
}

 

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

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

相关文章

Matlab|考虑可再生能源消纳的电热综合能源系统日前经济调度模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 下载链接 1 主要内容 本程序参考文献《考虑可再生能源消纳的建筑综合能源系统日前经济调度模型》模型&#xff0c;建立了电热综合能源系统优化调度模型&#xff0c;包括燃气轮机、燃气锅炉、余热…

Arduino RP2040 + SSD1306 I2C OLED +LittleFS存储GBK字库实现中文显示

Arduino RP2040 + SSD1306 I2C OLED +LittleFS存储GBK字库实现中文显示 📌LittleFS插件安装,可以参考《Arduino RP2040 LittleFS的使用介绍》🎈相关内容《Arduino esp8266 软件I2C SSD1306 +LittleFS存储GBK字库实现中文显示》🔖基于Earle F. Philhower, III的核心固件开…

如何针对机械表进行识别读数

识别机械表的读数通常涉及到图像处理和模式识别技术。以下是一个简单的例子&#xff0c;使用Python和OpenCV库来识别机械表的读数。这个例子假设表盘是静止的&#xff0c;并且有一个清晰的背景。 首先&#xff0c;你需要安装OpenCV库&#xff08;如果你还没有安装的话&#xff…

Python基础(七)之数值类型集合

Python基础&#xff08;七&#xff09;之数值类型集合 1、简介 集合&#xff0c;英文set。 集合&#xff08;set&#xff09;是由一个或多个元素组成&#xff0c;是一个无序且不可重复的序列。 集合&#xff08;set&#xff09;只存储不可变的数据类型&#xff0c;如Number、…

修改yolov9的模型打印不出来Gflops的解决办法

正在修改yolov9的模块&#xff0c;发现修改后的模型没有GFlops这个参数 解决办法&#xff1a; 找到utils/torch_utils.py这个文件&#xff0c;有一个model_info函数 然后将其中的stride改为固定的640就可以打印了。 stride max(int(model.stride.max()), 32) if hasattr(mo…

请求头content-type的类型有什么?

"Content-Type" 是 HTTP 请求头中的一个字段&#xff0c;用于指示发送给接收方的实体正文的媒体类型。常见的 "Content-Type" 类型包括但不限于以下几种&#xff1a; application/json&#xff1a; 用于指示请求或响应中的实体正文是 JSON 格式的数据。 ap…

telnet命令使用

window启用telnet telnet命令连接服务端 启动netty服务端后&#xff0c;使用如下cmd命令连接服务端&#xff0c;按enter&#xff0c;将连接到netty服务端 再按CTRL ]&#xff0c;进入命令交互界面 输入 help&#xff0c;查看命令介绍 发送消息&#xff0c;再断开连接&…

Linux:系统初始化,内核优化,性能优化(2)

优化ssh协议 Linux&#xff1a;ssh配置_ssh配置文件-CSDN博客https://blog.csdn.net/w14768855/article/details/131520745?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171068202516800197044705%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fb…

js基础语法大全(时间戳,uuid,字符串转json)

目录 一、获取时间戳二、获取uuid三、字符串转json格式 一、获取时间戳 var times Math.round(new Date().getTime()/1000).toString(); //获取 10位 时间戳 console.log(times);二、获取uuid function guid() {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]…

[蓝桥杯 2020 省 AB1] 走方格

题目链接 [蓝桥杯 2020 省 AB1] 走方格 题目描述 在平面上有一些二维的点阵。 这些点的编号就像二维数组的编号一样&#xff0c;从上到下依次为第 1 1 1 至第 n n n 行&#xff0c;从左到右依次为第 1 1 1 至第 m m m 列&#xff0c;每一个点可以用行号和列号来表示。 现…

【自然语言处理共现矩阵应用】共现矩阵用于表示文本中词语之间的共现关系

代码实现了共现矩阵的构建,共现矩阵用于表示文本中词语之间的共现关系。下面是代码实现原理的详细解释: create_co_occurrence_matrix 函数: 这个函数接受一个文本语料 corpus 和一个窗口大小 window_size。 corpus 是一个包含多个句子的列表,每个句子是一个字符串。 win…

拜占庭将军问题相关问题

1、拜占庭将军问题基本描述 问题 当我们讨论区块链共识时&#xff0c;为什么会讨论拜占庭将军问题&#xff1f; 区块链网络的本质是一个分布式系统&#xff0c;在存在恶意节点的情况下&#xff0c;希望 整个系统当中的善良节点能够对于重要的信息达成一致&#xff0c;这个机…

2024年3月18日 十二生肖 今日运势

小运播报&#xff1a;2024年3月18日&#xff0c;星期一&#xff0c;农历二月初九 &#xff08;甲辰年丁卯月辛巳日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;牛、鸡、猴 需要注意&#xff1a;鼠、虎、猪 喜神方位&#xff1a;西南方 财神方位&#xff1a;…

分数相加减(C语言)

一、流程图&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int fenmu 2;int result 1;int fuhao 1;//执行循环&#xff1b;while (fenmu < 100){//运算&#xff1b;fuhao (-1…

mvnd 安装和配置

mvnd 是 maven 的增强工具&#xff0c;在执行速度方面优于 maven 下载安装&#xff1a; https://github.com/apache/maven-mvnd/releases/ 根据不同的系统下载不同的安装包 配置环境变量 Path 新增 mvnd 安装路径下的 bin 目录 E:\maven-mvnd-1.0-m8-m39-windows-amd64\b…

HCIA——30奈奎斯特定理、香农定理

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

leetcode猜数字大小

猜数字游戏的规则如下&#xff1a; 每轮游戏&#xff0c;我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。如果你猜错了&#xff0c;我会告诉你&#xff0c;你猜测的数字比我选出的数字是大了还是小了。 你可以通过调用一个预先定义好的接口 int guess(int num)…

MySQL语法分类 DQL(4)聚合函数

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

四级缓存实现

CommandLineRunner接口的run方法 什么是多级缓存? 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Server端的压力,提升服务性能。 一级缓存:1.CDN:内容分发网络 二级缓存:2.NGINX+Lua脚本+OpenResty服务器 负载均衡反向代理【静态和转发】 三级缓存:J…

数据结构之顺序表(C语言版)

顺序表是数据结构中最基本的一种线性表&#xff0c;它以一段连续的存储空间来存储数据元素&#xff0c;元素之间的顺序由它们在内存中的位置来决定。在C语言中&#xff0c;我们通常使用数组来实现顺序表。 目录 顺序表的结构定义 顺序表的基本操作 应用实例 顺序表的结构定义…