您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
redis XREAD
发布时间:2021-11-14 19:19:25编辑:雪饮阅读()
使用 XREAD 以阻塞或非阻塞方式获取消息列表 ,语法格式:
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
count :数量
milliseconds :可选,阻塞毫秒数,没有设置就是非阻塞模式
key :队列名
id :消息 ID
实例:
首先我有两个消息队列
127.0.0.1:6379> xlen user1_user2_queue
(integer) 3
127.0.0.1:6379> xlen user2_user1_queue
(integer) 3
127.0.0.1:6379> xrange user1_user2_queue - +
1) 1) "1636886085878-0"
2) 1) "field1"
2) "val1"
2) 1) "1636886089222-0"
2) 1) "field1"
2) "val1"
3) 1) "1636886091931-0"
2) 1) "field1"
2) "val1"
127.0.0.1:6379> xrange user2_user1_queue - +
1) 1) "1636887322467-0"
2) 1) "field1"
2) "val1"
2) 1) "1636887327592-0"
2) 1) "field1"
2) "val1"
3) 1) "1636887329359-0"
2) 1) "field1"
2) "val1"
我们分别从上面两个队列里面获取各自的消息列表:
127.0.0.1:6379> xread streams user1_user2_queue user2_user1_queue 0-0 0-0
1) 1) "user1_user2_queue"
2) 1) 1) "1636886085878-0"
2) 1) "field1"
2) "val1"
2) 1) "1636886089222-0"
2) 1) "field1"
2) "val1"
3) 1) "1636886091931-0"
2) 1) "field1"
2) "val1"
2) 1) "user2_user1_queue"
2) 1) 1) "1636887322467-0"
2) 1) "field1"
2) "val1"
2) 1) "1636887327592-0"
2) 1) "field1"
2) "val1"
3) 1) "1636887329359-0"
2) 1) "field1"
2) "val1"
每个队列可以指定从具体某个id开始获取,像是上面这样就是从每个队列的头部开始获取,那么我可以指定如我将第一个队列的获取方式修改为从第一个队列的第一个消息之后才开始获取,则:
127.0.0.1:6379> xread streams user1_user2_queue user2_user1_queue 1636886085878-0 0-0
1) 1) "user1_user2_queue"
2) 1) 1) "1636886089222-0"
2) 1) "field1"
2) "val1"
2) 1) "1636886091931-0"
2) 1) "field1"
2) "val1"
2) 1) "user2_user1_queue"
2) 1) 1) "1636887322467-0"
2) 1) "field1"
2) "val1"
2) 1) "1636887327592-0"
2) 1) "field1"
2) "val1"
3) 1) "1636887329359-0"
2) 1) "field1"
2) "val1"
既然是可以获取多个stream的队列消息列表,那么我只获取一个队列也是可以的:
127.0.0.1:6379> xread streams user1_user2_queue 0-0
1) 1) "user1_user2_queue"
2) 1) 1) "1636886085878-0"
2) 1) "field1"
2) "val1"
2) 1) "1636886089222-0"
2) 1) "field1"
2) "val1"
3) 1) "1636886091931-0"
2) 1) "field1"
2) "val1"
对于从steams中获取每个队列的长度限制,可以使用count,但是count是针对整个streams并不是可以单独指定某个一个stream的:
127.0.0.1:6379> xread count 2 count 3 streams user1_user2_queue user2_user1_queue 1-0 0-0
1) 1) "user1_user2_queue"
2) 1) 1) "1636886085878-0"
2) 1) "field1"
2) "val1"
2) 1) "1636886089222-0"
2) 1) "field1"
2) "val1"
3) 1) "1636886091931-0"
2) 1) "field1"
2) "val1"
2) 1) "user2_user1_queue"
2) 1) 1) "1636887322467-0"
2) 1) "field1"
2) "val1"
2) 1) "1636887327592-0"
2) 1) "field1"
2) "val1"
3) 1) "1636887329359-0"
2) 1) "field1"
2) "val1"
127.0.0.1:6379> xread count 2 streams user1_user2_queue user2_user1_queue 1-0 0-0
1) 1) "user1_user2_queue"
2) 1) 1) "1636886085878-0"
2) 1) "field1"
2) "val1"
2) 1) "1636886089222-0"
2) 1) "field1"
2) "val1"
2) 1) "user2_user1_queue"
2) 1) 1) "1636887322467-0"
2) 1) "field1"
2) "val1"
2) 1) "1636887327592-0"
2) 1) "field1"
2) "val1"
可以看到当你设置多个count的时候,后面的count会覆盖前面的count,这里的第一个查询中count 2和count 3,最后只按count 3进行查询限制了。
对于读取时候从具体那个id来读取,这里可以针对每个队列单独设置,而像是上面的0-0则可以简写为0,因为就目前来看可以发现消息id真正有效部分就是“xxx-0”中“xxx”部分,而右边那部分如果我理解的正确的话,应该是序列号。
这里ID的序列号部分缺少,将总是被解释为0,所以命令:
127.0.0.1:6379> xread count 2 streams user1_user2_queue user2_user1_queue 0 0
1) 1) "user1_user2_queue"
2) 1) 1) "1636886085878-0"
2) 1) "field1"
2) "val1"
2) 1) "1636886089222-0"
2) 1) "field1"
2) "val1"
2) 1) "user2_user1_queue"
2) 1) 1) "1636887322467-0"
2) 1) "field1"
2) "val1"
2) 1) "1636887327592-0"
2) 1) "field1"
2) "val1"
等同于命令:
127.0.0.1:6379> xread count 2 streams user1_user2_queue user2_user1_queue 0-0 0-0
1) 1) "user1_user2_queue"
2) 1) 1) "1636886085878-0"
2) 1) "field1"
2) "val1"
2) 1) "1636886089222-0"
2) 1) "field1"
2) "val1"
2) 1) "user2_user1_queue"
2) 1) 1) "1636887322467-0"
2) 1) "field1"
2) "val1"
2) 1) "1636887327592-0"
2) 1) "field1"
2) "val1"
而对于阻塞毫秒数我的理解应该是阻塞其它线程的。类似于超买超卖那种现象的防止吧。(多个线程读取了相同的东西),可能理解有误,大家可以在文末进行评论发出你的看法。
关键字词:redis,XREAD
上一篇:redis XREVRANGE