使用 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"
相关推荐
Asthenia04126 分钟前
由浅入深解析Redis事务机制及其业务应用-电商场景解决超卖
后端
Asthenia04127 分钟前
Redis详解:从内存一致性到持久化策略的思维链条
后端
Asthenia04127 分钟前
深入剖析 Redis 持久化:RDB 与 AOF 的全景解析
后端
Apifox18 分钟前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
掘金一周25 分钟前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
uhakadotcom1 小时前
构建高效自动翻译工作流:技术与实践
后端·面试·github
Asthenia04121 小时前
深入分析Java中的AQS:从应用到原理的思维链条
后端
Asthenia04121 小时前
如何设计实现一个定时任务执行器 - SpringBoot环境下的最佳实践
后端
兔子的洋葱圈1 小时前
【django】1-2 django项目的请求处理流程(详细)
后端·python·django
Asthenia04122 小时前
如何为这条sql语句建立索引:select * from table where x = 1 and y < 1 order by z;
后端