一般情况下,从 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,效率要高得多。

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐