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