使用 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"
相关推荐
懒惰蜗牛19 分钟前
Day24 | Java泛型通配符与边界解析
java·后端·java-ee
Eoch7741 分钟前
从买菜到秒杀:Redis为什么能让你的网站快如闪电?
java·后端
我不是混子1 小时前
奇葩面试题:线程调用两次start方法会怎样?
java·后端
摸鱼总工1 小时前
为什么读源码总迷路?有破解办法吗
后端
仙俊红1 小时前
深入理解 ThreadLocal —— 在 Spring Boot 中的应用与原理
java·spring boot·后端
折七2 小时前
告别传统开发痛点:AI 驱动的现代化企业级模板 Clhoria
前端·后端·node.js
白衣鸽子2 小时前
PageHelper:基于拦截器实现的SQL分页查询工具
后端·开源
璨sou2 小时前
IDE集成开发工具-IDEA
后端
程序员小假2 小时前
我们来说一说动态代理
java·后端
武子康3 小时前
大数据-108 Flink 流批一体化入门:概念解析与WordCount代码实践 批数据+流数据
大数据·后端·flink