3 redis实现一个消息中间件
使用list实现一个队列,可以从左侧入队,也可以从右侧入对
即可以从左侧读取,也可以从右侧读取
1、Lindex
Lindex 命令用于通过索引获取列表中的元素
也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二。
redis 127.0.0.1:6379> LINDEX KEY_NAME INDEX_POSITION
列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内,返回 nil。
例如:
redis 127.0.0.1:6379> LPUSH mylist "World"
(integer) 1redis 127.0.0.1:6379> LPUSH mylist "Hello"
(integer) 2redis 127.0.0.1:6379> LINDEX mylist 0
"Hello"redis 127.0.0.1:6379> LINDEX mylist -1
"World"redis 127.0.0.1:6379> LINDEX mylist 3 # index不在 mylist 的区间范围内
(nil)
2、Rpush
Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)
如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。
redis 127.0.0.1:6379> RPUSH KEY_NAME VALUE1..VALUEN
返回值:是执行 RPUSH 操作后,列表的长度。
例如:
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "bar"
(integer) 3
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "foo"
3) "bar"
set是做不了的,set没有顺序,无法满足FIFO
3、代码实现
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.util.List;@Component
public class ListVer{public final static String RS_LIST_MQ_NS = "rlm:";@Autowiredprivate JedisPool jedisPool;/*消费者接受消息*/public List<String> get(String key) {Jedis jedis = null;try {jedis = jedisPool.getResource();//阻塞式的等待消息,如果队列中没有数据的话,就一直等//0:表示等待0s,没有数据就不等待了return jedis.brpop(0,RS_LIST_MQ_NS + key);} catch (Exception e) {throw new RuntimeException("接受消息失败!");} finally {jedis.close();}}/*生产者发送消息*/public void put(String key, String message) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.lpush(RS_LIST_MQ_NS+key,message);} catch (Exception e) {throw new RuntimeException("发送消息失败!");} finally {jedis.close();}}
}
注意:保持key的一致性
延迟消息的场景:
比如已经加入购物车中,购买的电影票,还没有付款的时候锁定座位,进行延迟消息投递。
之后再启动另一个消费端去监控这个延迟消息,到了时间后还没有支付的话,则进行取消操作.
可以使用sorted set(有序集合)来实现延迟消息,实际生产中不建议使用,还是使用正经的MQ。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;@Component
public class ZSetVer {//标记是延迟消息的keypublic final static String RS_ZS_MQ_NS = "rzsm:";@Autowiredprivate JedisPool jedisPool;/*生产者,消息的发送,实际生产中,相关参数,比如订单信息,过期时间等应该传入,可以考虑将订单信息json化存入redis*/public void producer() {Jedis jedis = null;try {jedis = jedisPool.getResource();for (int i = 0; i < 5; i++) {//订单idString order_id = "000000000"+i;double score = System.currentTimeMillis()+(i*1000);jedis.zadd(RS_ZS_MQ_NS+"orderId",score, order_id);System.out.println("生产订单: " + order_id + " 当前时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));System.out.println((3 + i) + "秒后执行");}} catch (Exception e) {throw new RuntimeException("生产消息失败!");} finally {jedis.close();}}//消费者,取订单public void consumerDelayMessage() {Jedis jedis = null;try {jedis = jedisPool.getResource();while (true) {Set<String> order = jedis.zrangeByScore(RS_ZS_MQ_NS+"orderId", 0,System.currentTimeMillis(), 0,1);if (order == null || order.isEmpty()) {System.out.println("当前没有等待的任务");try {TimeUnit.MILLISECONDS.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}continue;}String s = order.iterator().next();if (jedis.zrem(RS_ZS_MQ_NS+"orderId", s)>0) {/*业务处理*/System.out.println(s);}}} catch (Exception e) {throw new RuntimeException("消费消息失败!");} finally {jedis.close();}}
}
相关文章:
3 redis实现一个消息中间件
使用list实现一个队列,可以从左侧入队,也可以从右侧入对 即可以从左侧读取,也可以从右侧读取 1、Lindex Lindex 命令用于通过索引获取列表中的元素 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的…...
js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。
遇到一个需求,Vue项目做一个表格,要求表头与表格内容分开,如下效果所示,表头与表格有个高度间隔边距(箭头所示),因为默认我们的el-table的表头与内容是一起的: 思路:通过querySelector获取el-table__header-wrapper元素,通过createElement创建一个div,通过 newElem…...
C语言结构体
#include <stdio.h> #include <string.h> #include <stdlib.h>//struct Student_s { // int num; // char name[20]; // char gender; // int age; // float Chinese; // float Math; // float English; // char addr[30]; //}; //最后的分号一定要写&#x…...
【Python大数据笔记_day10_Hive调优及Hadoop进阶】
hive调优 hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时,不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率,或帮助定位问…...
React经典初级错误
文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案,感兴…...
C# System.Array.CopyTo() 和 System.Array.Clone() 有什么区别
System.Array.CopyTo() 和 System.Array.Clone() 是用于数组复制的两种不同方法,它们在实现和用途上有一些区别。 System.Array.CopyTo() 方法: CopyTo() 方法用于将数组的元素复制到另一个数组。它是 Array 类的实例方法,可以用于复制一个…...
Stable Diffusion 启动时 got an unexpected keyword argument ‘socket_options‘ 错误解决
Stable Diffusion 启动时 got an unexpected keyword argument socket_options 错误解决 问题解决方法 问题 Launching Web UI with arguments: Traceback (most recent call last):File "launch.py", line 48, in <module>main()File "launch.py"…...
CSS 文本属性篇
文字颜色 属性名:color作用:控制文字的颜色可选值: 1.颜色名 color: blue; 2.rgb或rgba color:rgb(132, 220, 254); color:rgba(132, 220, 254,0.5); 3.hex或hexa(十六进制) color:#0078d4; color:#0078d48b; 4.hsl或h…...
Activiti,Apache camel,Netflex conductor对比,业务选型
Activiti,Apache camel,Netflex conductor对比,业务选型 1.activiti是审批流,主要应用于人->系统交互,典型应用场景:请假,离职等审批 详情可见【精选】activti实际使用_activiti通过事件监听器实现的优势_记录点滴…...
pythom导出mysql指定binlog文件
要求 要求本地有py环境和全局环境变量 先测试直接执行binlog命令执行命令 Windows 本地直接执行命令 # E:\output>E:\phpstudy_pro\Extensions\MySQL5.7.26\bin\mysqlbinlog binglog文件地址 # --no-defaults 不限制编码 # -h mysql链接地址 # -u mysql 链接名称 # -p m…...
TDengine 跨版本迁移实战
TDengine 3.0 已经退出了近一年,目前已经到了 3.2 版本。很遗憾的是 2.x 和 3.x 之间的数据文件不兼容。 如果向从 2.x 升级到 3.x 只能选择数据迁移的方式。 目前数据迁移有三种方法: 使用官方推荐工具 taosx。使用 taosdump 工具。自己写程序。 迁移…...
FPGA设计时序约束八、others类约束之Set_Case_Analysis
目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中,存在一类特殊的约束,划分在others目录下,可用于设置忽略或修改默认的时序…...
xftp连接wsl2
在WSL中默认是没有安装OpenSSH,需要自己安装。 安装 sudo apt update sudo apt install openssh-server检查是否安装成功 ssh -V配置ssh sudo vim /etc/ssh/ssh_config设置端口 Port 22启动ssh服务 sudo service ssh startxftp连接 主机地址:127.…...
Cross-View Transformers for Real-Time Map-View Semantic Segmentation 论文阅读
论文链接 Cross-View Transformers for Real-Time Map-View Semantic Segmentation 0. Abstract 提出了 Cross-View Transformers ,一种基于注意力的高效模型,用于来自多个摄像机的地图视图语义分割使用相机感知的跨视图注意机制隐式学习从单个相机视…...
MySQL InnoDB 引擎底层解析(一)
6. InnoDB 引擎底层解析 MySQL 对于我们来说还是一个黑盒,我们只负责使用客户端发送请求并等待服务器返回结果,表中的数据到底存到了哪里?以什么格式存放的?MySQL 是以什么方式来访问的这些数据?这些问题我们统统不知…...
redis安装(Windows和linux)
如何实现Redis安装与使用的详细教程 Redis 简介 Redis是一个使用C语言编写的开源、高性能、非关系型的键值对存储数据库。它支持多种数据结构,包括字符串、列表、集合、有序集合、哈希表等。Redis的内存操作能力极强,其读写性能非常优秀,且…...
【LeetCode刷题-树】--1367.二叉树中的链表
1367.二叉树中的链表 方法:枚举 枚举二叉树中的每个节点为起点往下的路径是否与链表相匹配的路径,为了判断是否匹配设计了一个递归函数dfs(root,head),其中root表示当前匹配到的二叉树节点,head表示当前匹配到的链表节点,整个函数…...
【嵌入式 – GD32开发实战指南(ARM版本)】第2部分 外设篇 - 第3章 温度传感器DS18B20
1 理论分析 1.1 DS18B20概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 "一线总线"接口的温度传感器。 DS18B20采用的单总线协议,也…...
基于spring gateway 的静态资源缓存实现
由于子项目比较多,子项目都是通过嵌套的方式实现的。就会导致子页面加载比较慢,影响客户体验 实现思路(AI搜的--!): 1、通过spring boot缓存实现静态资源缓存 2、在gateway过滤器,对静态资源进行缓存 直接上代码&a…...
SDUT OJ《算法分析与设计》搜索算法
A - 子集和问题 Description 子集和问题的一个实例为〈S,t〉。其中,S{ x1 , x2 ,…,xn }是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得: 。 试设计一个解子…...
Driver Store Explorer完整指南:Windows驱动存储终极清理神器
Driver Store Explorer完整指南:Windows驱动存储终极清理神器 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Driver Store Explorer(简称RAPR)是一款…...
Label Studio数据源配置全攻略:除了S3和Azure,如何用本地文件夹搭建高效标注流水线?
Label Studio数据存储方案深度对比:从云端到本地的架构选型指南 在机器学习项目的数据标注环节,Label Studio已成为众多团队的首选工具。但面对不同规模、不同安全要求的项目时,如何选择最适合的数据存储方案却让许多技术决策者感到困扰。本文…...
Frida-Agent-Example实战指南:Native层动态插桩核心原理与工程落地
1. 这不是“又一个 Frida 教程”,而是一份能直接进项目、改代码、抓数据的实战手记你有没有遇到过这样的场景:App 里某个关键接口返回的数据结构藏在层层混淆的 Java/Kotlin 方法里,反编译出来的 smali 逻辑像天书;或者某个加密参…...
第一次了解昇腾 NPU 的图编译?从 ge 开始
前言 当你第一次尝试把 PyTorch 模型放到昇腾 NPU 上跑的时候,大概率会遇到这个问题:模型加载成功了,但推理速度慢得让人怀疑人生。或者更糟糕:模型加载失败,报错说某些算子不支持。 这些问题的根源,通常…...
机器学习调试:从数据到部署的系统化故障诊断与修复实践
1. 机器学习调试:从“炼丹”到“精密工程”的必经之路在机器学习项目的日常推进中,我们常常会经历一个从兴奋到困惑,再到“玄学”调试的循环。模型在验证集上表现优异,一上线就“翻车”;训练时损失曲线平滑下降&#x…...
Unity项目降级回退的四层错误诊断与三步修复法
1. 这不是版本降级,是Unity项目“时空错位”的典型症状 很多人看到“unity回到低版本报错”,第一反应是:“不就是把高版本工程拖进低版本编辑器里打开嘛?点一下确定不就完了?”——我去年在接手一个外包美术团队交付的…...
告别默认动画!在银河麒麟Kylin Linux上打造个性化开机画面的保姆级教程
银河麒麟Kylin Linux开机动画深度定制指南:从原理到艺术创作1. 开机动画背后的技术原理与设计哲学开机动画远不止是几张图片的轮播,它是操作系统启动过程中用户接触到的第一个视觉交互界面。在银河麒麟Kylin Linux系统中,这套机制主要由Plymo…...
MNIST识别项目复盘:除了准确率97%,我们更应该关注数据预处理与损失函数的选择
MNIST识别项目深度复盘:超越97%准确率的工程实践思考 在完成一个基础的MNIST手写数字识别项目后,很多开发者会满足于模型达到97%的准确率便止步不前。然而,真正有价值的机器学习实践远不止于调出一个高准确率的模型。本文将带您深入两个常被忽…...
设计模式实战解读(二):工厂模式——对象创建的解耦艺术
本文是「设计模式实战解读」系列第二篇。系列文章统一按照 定义 → 痛点场景 → 模式结构 → 核心实现 → 真实应用 → 常见变种 → 优缺点 → 避坑指南 → FAQ 的结构展开,每篇聚焦一个模式讲透。 一句话定义 工厂模式(Factory):…...
2026最新免费在线去水印工具详细教程,在线去本地视频水印保姆级指南
你是不是也遇到过这种情况?辛辛苦苦在网上找到一个绝美视频素材想用在剪辑里,结果画面正中央横着一个硕大的水印;或者刷小红书看到一段干货满满的教学视频,想保存下来反复学习,却被角落的Logo劝退。更头疼的是…...
