redis队列批量获取
一般情况下,从 list 中获取数据可以是 lpop 或者 rpop,每执行一次,如果有数据就返回数据,如果没有就返回空。在此基础上又有两个优化后的命令 blpop 和brpop,也是每次只取一条记录,但碰到 list 为空时,就陷入阻塞状态,直到有数据为止。以上四个命令都是单条记录获取,事实上 redis 还提供了 lrange 和 ltrim 两个命令,可搭配使用使得批量获取 list 中数据
一般情况下,从 list 中获取数据可以是 lpop 或者 rpop,每执行一次,如果有数据就返回数据,如果没有就返回空。
在此基础上又有两个优化后的命令 blpop 和 brpop,也是每次只取一条记录,但碰到 list 为空时,就陷入阻塞状态,直到有数据为止。
以上四个命令都是单条记录获取,事实上 redis 还提供了 lrange 和 ltrim 两个命令,可搭配使用使得批量获取 list 中数据。
lrange 返回 list 中指定区间内的元素,区间范围通过偏移量 start 和 end 确定。如往队列 chars 塞入26个英文字母:
127.0.0.1:6379> rpush chars a b c d e f g h i j k l m n o p q r s t u v w x y z
(integer) 26
127.0.0.1:6379> llen chars
(integer) 26
如果查看队列 chars 中前 10 条数据:
127.0.0.1:6379> lrange chars 0 9
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
8) "h"
9) "i"
10) "j"
127.0.0.1:6379> llen chars
(integer) 26
注意,此时虽然能获取到 list 中数据,但是数据并没有从 list 中删除,从执行 llen 命令显示还有 26 条记录也能看出来。这时候就要派上 ltrim 命令了。
ltrim 命令是对一个 list 进行裁剪,只获取指定区间内的元素,区间范围也由偏移量 start 和 end 确定。如果 end 值为 -1,则保留到最后一个元素。
由于已经拿到 list 中前 10 条数据,现在只需要保留从第 11 个元素开始及后面的所有数据。
127.0.0.1:6379> ltrim chars 10 -1
OK
127.0.0.1:6379> llen chars
(integer) 16
127.0.0.1:6379> lrange chars 0 -1
1) "k"
2) "l"
3) "m"
4) "n"
5) "o"
6) "p"
7) "q"
8) "r"
9) "s"
10) "t"
11) "u"
12) "v"
13) "w"
14) "x"
15) "y"
16) "z"
在执行 ltrim 命令后可以看到队列 chars 中只剩下 16 条数据,并且删除的数据恰好就是前面通过 lrange 获取的 10 条数据。
至此就实现了批量获取 redis 队列中数据,相对逐条获取 rpop 和 brpop,效率要高得多。
更多推荐
所有评论(0)