天天看點

redis隊列批量擷取

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

繼續閱讀