1. 程式人生 > >redis-列表型別命令操作筆記

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 > 0LREM命令會從列表左邊開始刪除前count個值為value的元素。

(2)當count < 0LREM命令會從列表右邊開始刪除前|count|個值為value的元素。

(3)當count = 0LREM命令會刪除所有值為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 命令可以很直觀地在多個佇列中傳遞資料。當sourcedestination相同時,RPOPLPUSH命令會不斷地將隊尾的元素移到隊首,藉助這個特性我們可以實現一個網站監控系統:使用一個佇列儲存需要監控的網址,然後監控程式不斷地使用RPOPLPUSH命令迴圈取出一個網址來測試可用性。這裡使用RPOPLPUSH命令的好處在於在程式執行過程中仍然可以不斷地向網址列表中加入新網址,而且整個系統容易擴充套件,允許多個客戶端同時處理佇列。

書籤:集合型別