使用 Redis Stream 解决 Java 与 Python 的长连接请求交互

使用 Redis Stream 解决 Java 与 Python 的长连接请求交互

基本使用

XADD 队列添加消息

css 复制代码
XADD key ID field value [field value ...]
  • key :队列名称,如果不存在就创建
  • ID :消息 id,我们使用 * 表示由 redis 生成,可以自定义,但是要自己保证递增性。
  • field value : 记录。
bash 复制代码
# 向队列当中推送一条稳态建模消息
XADD javaToPython * modelId 25 type steady path f:/data/csv/build_test.csv
​
# 返回一个 redis 自动生成的消息 id
"1734486699344-0"
​
# 再次推送一条瞬态建模的消息
XADD javaToPython * modelId 26 type transient path f:/data/csv/build_test02.csv pointNames AMD10001.AD
​
#返回一条消息 id
"1734486930841-0"

XLEN 获取队列当中存在的消息长度

vbnet 复制代码
XLEN key
  • key:队列名称
bash 复制代码
# 获取当前现存的消息长度
XLEN javaToPython
​
# 现有之前推送的两条消息
(integer) 2

XDEL 删除队列当中的消息

css 复制代码
XDEL key ID [ID ...]
  • key:队列名称
  • ID :消息 ID
bash 复制代码
#向队列当中再次添加一条新的消息
XADD javaToPython * modelId 27 type steady path f:/data/csv/build_test03.csv
"1734487532701-0"
​
#查看当前队列的长度
XLEN javaToPython
(integer) 3
​
#删除消息成功返回 1
XDEL javaToPython 1734487532701-0
(integer) 1
​
#再次查看当前队列的长度
XLEN javaToPython
(integer) 2

XRANGE 顺序获取队列消息

ini 复制代码
#该命令会自动的过滤到被删除的消息
XRANGE key start end [COUNT count]
  • key :队列名
  • start :开始值, - 表示最小值
  • end :结束值, + 表示最大值
  • count :数量
bash 复制代码
# 从队列当中从降序获取两条消息 
XRANGE javaToPython - + COUNT 2 
​
#当前队列当中存在的消息
1) 1) "1734486699344-0"
   2) 1) "modelId"
      2) "25"
      3) "type"
      4) "steady"
      5) "path"
      6) "f:/data/csv/build_test.csv"
2) 1) "1734486930841-0"
   2) 1) "modelId"
      2) "26"
      3) "type"
      4) "transient"
      5) "path"
      6) "f:/data/csv/build_test02.csv"
      7) "pointNames"
      8) "AMD10001.AD"

XREVRANGE 逆序获取队列消息

ini 复制代码
#该命令会自动的过滤到被删除的消息
XREVRANGE key end start [COUNT count]
  • key :队列名
  • end :结束值, + 表示最大值
  • start :开始值, - 表示最小值
  • count :数量
bash 复制代码
# 从队列当中从升序获取两条消息 
XRANGE javaToPython - + COUNT 2

#当前队列当中存在的消息
1) 1) "1734486930841-0"
   2) 1) "modelId"
      2) "26"
      3) "type"
      4) "transient"
      5) "path"
      6) "f:/data/csv/build_test02.csv"
      7) "pointNames"
      8) "AMD10001.AD"
2) 1) "1734486699344-0"
   2) 1) "modelId"
      2) "25"
      3) "type"
      4) "steady"
      5) "path"
      6) "f:/data/csv/build_test.csv"

XREAD 非阻塞方式获取消息队列

css 复制代码
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
  • count :数量
  • milliseconds :可选,阻塞毫秒数,没有设置就是非阻塞模式
  • key :队列名
  • id :消息 ID
javascript 复制代码
# 向添加两组消息分别到队列 javaToPython_one 与 javaToPython_two 当中
XADD javaToPython_one * modelId 25 name steady_model_one path f:/data/csv/build_test_001.csv
"1734488861940-0"

XADD javaToPython_one * modelId 26 name steady_model_two path f:/data/csv/build_test_002.csv
"1734488866997-0"

XADD javaToPython_two * modelId 27 name transient_model_one path f:/data/csv/build_test.csv
"1734488872164-0"

XADD javaToPython_two * modelId 28 name transient_model_two path f:/data/csv/build_test.csv
"1734488876470-0"

# 从 Stream 头部读取两条消息 这里的 0-0 表示的意思是不指定 id,不指定 id 默认就用 0 或者 0-0 表示
XREAD COUNT 2 STREAMS javaToPython_one javaToPython_two 0-0 0-0 

1) 1) "javaToPython_one"
   2) 1) 1) "1734488861940-0"
         2) 1) "modelId"
            2) "25"
            3) "name"
            4) "steady_model_one"
            5) "path"
            6) "f:/data/csv/build_test_001.csv"
      2) 1) "1734488866997-0"
         2) 1) "modelId"
            2) "26"
            3) "name"
            4) "steady_model_two"
            5) "path"
            6) "f:/data/csv/build_test_002.csv"
2) 1) "javaToPython_two"
   2) 1) 1) "1734488872164-0"
         2) 1) "modelId"
            2) "27"
            3) "name"
            4) "transient_model_one"
            5) "path"
            6) "f:/data/csv/build_test.csv"
      2) 1) "1734488876470-0"
         2) 1) "modelId"
            2) "28"
            3) "name"
            4) "transient_model_two"
            5) "path"
            6) "f:/data/csv/build_test.csv"

XGROUP CREATE 创建一个消费群组

css 复制代码
XGROUP [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]
  • key :队列名称,如果不存在就创建
  • groupname :组名。
  • $ : 表示从尾部开始消费,只接受新消息,当前 Stream 消息会全部忽略。
从头开始消费:
csharp 复制代码
#创建一个python 端从头开始的消费组
XGROUP CREATE javaToPython_one java-to-pytohn-group 0-0  
从尾部开始消费:
csharp 复制代码
#创建一个python 端从尾开始的消费组
XGROUP CREATE javaToPython_two java-to-pytohn-group $

XREADGROUP GROUP 读取消费组的消息

css 复制代码
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]
  • group :消费组名
  • consumer :消费者名。
  • count : 读取数量。
  • milliseconds : 阻塞毫秒数。
  • key : 队列名。
  • ID : 消息 ID。
bash 复制代码
# 查看 javaToPython_one 队列的当前长度
XLEN javaToPython_one

# 当前队列当中有两条消息
(integer) 2

# 查看一下当前队列当中的消息
XRANGE javaToPython_one - + COUNT 2
# 当前队列当中存在的消息
1) 1) "1734488861940-0"
   2) 1) "modelId"
      2) "25"
      3) "name"
      4) "steady_model_one"
      5) "path"
      6) "f:/data/csv/build_test_001.csv"
2) 1) "1734488866997-0"
   2) 1) "modelId"
      2) "26"
      3) "name"
      4) "steady_model_two"
      5) "path"
      6) "f:/data/csv/build_test_002.csv"


# 从 python 端的消费组 java-to-pytohn-group 开始进行消费,java 端发向队列 javaToPython_one 推送的消息
XREADGROUP GROUP java-to-pytohn-group python-one-consumer COUNT 1 STREAMS javaToPython_one >
# 消费了一条消息
1) 1) "javaToPython_one"
   2) 1) 1) "1734488861940-0"
         2) 1) "modelId"
            2) "25"
            3) "name"
            4) "steady_model_one"
            5) "path"
            6) "f:/data/csv/build_test_001.csv"        
# 再次消费一条消息
1) 1) "javaToPython_one"
   2) 1) 1) "1734488866997-0"
         2) 1) "modelId"
            2) "26"
            3) "name"
            4) "steady_model_two"
            5) "path"
            6) "f:/data/csv/build_test_002.csv"

XACK 确认消息消费

xml 复制代码
XACK <stream> <group> <ID>
  • stream: 队列名
  • group: 消费者组的名称
  • ID: 消息的唯一 id
vbnet 复制代码
# 检查当前的消费状态
XPENDING javaToPython_one java-to-pytohn-group 

# 可以看到java-to-pytohn-group 组下的 javaToPython_one 队列有两条消息还未被消费
1) "2" 					 	  
2) "1734488861940-0" 			
3) "1734488866997-0" 			
4) 1) 1) "python-one-consumer"  
      2) "2"

# python 端 java-to-pytohn-group 组下的 javaToPython_one 消费者确认 id 为 1734488866997-0 的消息被消费
XACK javaToPython_one java-to-pytohn-group  1734488866997-0
#确认成功返回 1
(integer) 1

# 可以看到 id 为 1734488866997-0 的消息已被消费,目前只剩一条消息
XPENDING javaToPython_one java-to-pytohn-group 
1) "1"
2) "1734488861940-0"
3) "1734488861940-0"
4) 1) 1) "python-one-consumer"
      2) "1"

检查消息是否消费

xml 复制代码
XPENDING <stream> <group>
  • stream: 队列名
  • group: 消费者组的名称
bash 复制代码
# 检查 java-to-pytohn-group 组是否将 javaToPython_one 队列当中的消息消费
XPENDING javaToPython java-python-service

# 返回结果
1) "2" 					 	   # 未确认消息数量 2 表示有两条消息未确认
2) "1734488861940-0" 			# 消息 ID 范围 1734488861940-0 到 1734488866997-0 这个时间端内未确认的消息
3) "1734488866997-0" 			# 消息 ID 范围 1734488861940-0 到 1734488866997-0 这个时间端内未确认的消息
4) 1) 1) "python-one-consumer"   # 表示 python-one-consumer 消费者有两条消息未被消费
      2) "2"
相关推荐
武子康16 分钟前
Java-74 深入浅出 RPC Dubbo Admin可视化管理 安装使用 源码编译、Docker启动
java·分布式·后端·spring·docker·rpc·dubbo
RainbowSea43 分钟前
“ 蒲公英图仓 ” —— 论坛
后端
Brookty1 小时前
Java线程创建与运行全解析
java·开发语言·后端·学习·java-ee·线程
野生程序员y1 小时前
spring容器的bean是单例还是多例的?线程安全吗?
java·后端·spring
星辰大海的精灵1 小时前
Java 线程池的工作原理及实践
java·后端·架构
满分观察网友z2 小时前
从选择困难到最优策略:我如何用DP搞定“鱼和熊掌兼得”的排程难题(1751. 最多可以参加的会议数目 II)
后端·算法
我命由我123452 小时前
Spring Boot - Spring Boot 集成 MyBatis 分页实现 手写 SQL 分页
java·spring boot·后端·sql·spring·java-ee·mybatis
天天摸鱼的java工程师2 小时前
每天导入100万数据导致数据库死锁?
java·后端·面试
Xxtaoaooo2 小时前
手撕Spring底层系列之:IOC、AOP
java·后端·spring·spring框架·底层源码剖析
Penge6662 小时前
Lucene 索引文件结构
后端