使用LMOVE/BLMOVE实现可靠队列(6.2.0起可用)

  1. 启动个后台运行的Redis容器
docker run --name some-redis -d redis

2. 进入这个容器的bash

docker exec -it some-redis /bin/bash

3. 进入redis-cli并查看版本

root@879a9d554188:/data# redis-cli
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> info
# Server
redis_version:6.2.6
...

4. 向L1插入一些数据

127.0.0.1:6379> RPUSH L1 1 2 3 4 5 6 7 8 9
(integer) 9

5. L1 头部的2元素依次推入L2的尾部,并观察变化后的列表内容

127.0.0.1:6379> LMOVE L1 L2 LEFT RIGHT
"1"
127.0.0.1:6379> LMOVE L1 L2 LEFT RIGHT
"2"
127.0.0.1:6379> LRANGE L1 0 -1
1) "3"
2) "4"
3) "5"
4) "6"
5) "7"
6) "8"
7) "9"
127.0.0.1:6379> LRANGE L2 0 -1
1) "1"
2) "2"
127.0.0.1:6379>

6. 清空列表的数据,并使用 BLMOVE 监听新的数据:

127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"1"
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"2"
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"3"
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"4"
127.0.0.1:6379>
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"5"
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"6"
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"7"
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"8"
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"9"
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
^[[A^C
root@879a9d554188:/data# redis-cli
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666

7. 启动另一个命令行,并推入一条数据

PS D:\Desktop> docker exec -it  some-redis  /bin/bash
root@879a9d554188:/data#
root@879a9d554188:/data#
root@879a9d554188:/data# redis-cli
127.0.0.1:6379> RPUSH L1 test1
(integer) 1
127.0.0.1:6379>

8. BLMOVE 获取到新的数据

127.0.0.1:6379> BLMOVE L1 L2 LEFT RIGHT 666
"test1"
(32.57s)
127.0.0.1:6379>

9. 假设“test1”已经被正确处理了,使用 LREM 从L2删除已经处理了的数据,可以看到”test1″,已经消失了

127.0.0.1:6379> LREM L2 1 test1
(integer) 1
127.0.0.1:6379> LRANGE L2 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "test2"
127.0.0.1:6379>

小结:

使用 BLMOVE 监听列表,使用 LREM 删除已经成功消费了的数据!看起来挺简单的!

BLMOVE 命令格式:

BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout

Available since 6.2.0.
Time complexity: O(1)

使用LMOVE/BLMOVE实现可靠队列(6.2.0起可用)》有一个想法

  1. Pingback引用通告: 介绍Redis数据类型和抽象 | 杨龙

评论已关闭。