redis-列表型別命令操作筆記
列表型別
命令
1.向列表兩端增加元素
LPUSH key value [value …] # LPUSH命令用來向列表左邊增加元素,返回值表示增加元素後列表的長度。
# LPUSH命令還支援同時增加多個元素,例如:
redis> LPUSH numbers 2 3
(integer) 3
RPUSH key value [value …] #
向列表右邊增加元素的話則使用RPUSH命令,其用法和LPUSH命令一樣:
redis> RPUSH numbers 0 −1
(integer) 5
2.從列表兩端彈出元素
LPOP key
RPOP key
3.獲取列表中元素的個數
LLEN key
當鍵不存在時LLEN
會返回0:
redis> LLEN numbers
(integer) 3
4.獲得列表片段
LRANGE key start stop redis> LRANGE numbers 0 2 1) "2" 2) "1" 3) "0" LRANGE命令在取得列表片段的同時不會像LPOP一樣刪除該片段,另外LRANGE命令與很多語言中用來擷取陣列片段的方法slice有一點區別是LRANGE返回的值包含最右邊的元素, LRANGE命令也支援負索引,表示從右邊開始計算序數,如"−1"表示最右邊第一個元素,"-2"表示最右邊第二個元素,依次類推: redis> LRANGE numbers -2 -1 1) "1" 2) "0" 顯然,LRANGE numbers 0 -1可以獲取列表中的所有元素。另外一些特殊情況如下。 1.如果start的索引位置比stop的索引位置靠後,則會返回空列表。 2.如果stop大於實際的索引範圍,則會返回到列表最右邊的元素: redis> LRANGE numbers 1 999 1) "1" 2) "0"
5.刪除列表中指定的值
LREM key count value
LREM
命令會刪除列表中前count
個值為value
的元素,返回值是實際刪除的元素個數。根據count
值的不同,LREM
命令的執行方式會略有差異。
(1)當count > 0
時LREM
命令會從列表左邊開始刪除前count
個值為value
的元素。
(2)當count < 0
時LREM
命令會從列表右邊開始刪除前|count|
個值為value
的元素。
(3)當count = 0
是LREM
命令會刪除所有值為value
的元素。例如:
redis> RPUSH numbers 2 (integer) 4 redis> LRANGE numbers 0 -1 1) "2" 2) "1" 3) "0" 4) "2" # 從右邊開始刪除第一個值為"2"的元素 redis> LREM numbers -1 2 (integer) 1 redis> LRANGE numbers 0 -1 1) "2" 2) "1" 3) "0"
6.獲得/設定指定索引的元素值
LINDEX key index
LSET key index value
redis> LSET numbers 1 7
OK
redis> LINDEX numbers 1
"7"
7.只保留列表指定片段
LTRIM key start end
LTRIM命令可以刪除指定索引範圍之外的所有元素,其指定列表範圍的方法和LRANGE命令相同。就像這樣:
redis> LRANGE numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
"0"
redis> LTRIM numbers 1 2
OK
redis> LRANGE numbers 0 1
1) "2"
2) "7"
LTRIM
命令常和LPUSH
命令一起使用來限制列表中元素的數量,比如記錄日誌時我們希望只保留最近的100條日誌,則每次加入新元素時呼叫一次LTRIM
命令即可:
LPUSH logs $newLog
LTRIM logs 0 99
8.向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
LINSERT
命令首先會在列表中從左到右查詢值為pivot
的元素,然後根據第二個引數是BEFORE
還是AFTER
來決定將value
插入到該元素的前面還是後面。
LINSERT
命令的返回值是插入後列表的元素個數。示例如下:
redis> LRANGE numbers 0 -1
1) "2"
2) "7"
3) "0"
redis> LINSERT numbers AFTER 7 3
(integer) 4
redis> LRANGE numbers 0 -1
1) "2"
2) "7"
3) "3"
4) "0"
redis> LINSERT numbers BEFORE 2 1
(integer) 5
redis> LRANGE numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
5) "0"
9.將元素從一個列表轉到另一個列表
RPOPLPUSH source destination
RPOPLPUSH
是個很有意思的命令,從名字就可以看出它的功能:先執行RPOP
命令再執行LPUSH
命令。RPOPLPUSH
命令會先從source
列表型別鍵的右邊彈出一個元素,然後將其加入到destination
列表型別鍵的左邊,並返回這個元素的值,整個過程是原子的。其具體實現可以表示為虛擬碼:
def rpoplpush ($source, $destination)
$value = RPOP $source
LPUSH $destination, $value
return $value
當把列表型別作為佇列使用時,RPOPLPUSH
命令可以很直觀地在多個佇列中傳遞資料。當source
和destination
相同時,RPOPLPUSH
命令會不斷地將隊尾的元素移到隊首,藉助這個特性我們可以實現一個網站監控系統:使用一個佇列儲存需要監控的網址,然後監控程式不斷地使用RPOPLPUSH
命令迴圈取出一個網址來測試可用性。這裡使用RPOPLPUSH
命令的好處在於在程式執行過程中仍然可以不斷地向網址列表中加入新網址,而且整個系統容易擴充套件,允許多個客戶端同時處理佇列。
書籤:集合型別