一. 列表對象概述 在第9篇中講到了列表對象的編碼可以是ziplist或者linkedlist。ziplist編碼的列表對象使用壓縮列表作為底層實現,每個壓縮列表節點(entry)保存了一個列表元素。例如使用rpush命令將創建一個列表對象作為numbers鍵的值。 通過上面查看底層數據結構並不是z ...
一. 列表對象概述
在第9篇中講到了列表對象的編碼可以是ziplist或者linkedlist。ziplist編碼的列表對象使用壓縮列表作為底層實現,每個壓縮列表節點(entry)保存了一個列表元素。例如使用rpush命令將創建一個列表對象作為numbers鍵的值。
127.0.0.1:6379> rpush numbers 1 "three" 5 (integer) 3 127.0.0.1:6379> object encoding numbers "quicklist"
通過上面查看底層數據結構並不是ziplist,而是quicklist結構。 該結構是在redis 3.2版本中新加的數據結構,用在列表的底層實現,由ziplist組成的雙向鏈表。鏈表中的每一個節點都以壓縮列表ziplist的結構保存著數據,而ziplist有多個entry節點,保存著數據。相當與一個quicklist節點保存的是一片數據,而不再是一個數據。
例如:一個quicklist結構有4個quicklistNode節點,每個節點都保存著1個ziplist結構,每個ziplist的大小不超過8kb,ziplist的entry節點中的value成員保存著數據。以後在深入瞭解quicklist數據結構。
二. 列表對象命令
-- rpush 命令可向list的右邊(尾部)添加一個新元素,讀出來就是(A,B,first)。 127.0.0.1:6379> rpush mylist A (integer) 1 127.0.0.1:6379> rpush mylist B (integer) 2 127.0.0.1:6379> rpush mylist first (integer) 3 -- lrange 命令獲取列表指定範圍內的元素,帶有兩個索引,一定範圍的第一個和最後一個元素。-1表示最後一個元素,-2表示list中的倒數第二個元素,以此類推。下麵是讀出列表mylist。 127.0.0.1:6379> lrange mylist 0 -1 1) "A" 2) "B" 3) "first" -- lpush命令可向list的左邊(頭部)添加一個新元素,讀出來就是(first,B,A)。 127.0.0.1:6379> lpush mylist A (integer) 1 127.0.0.1:6379> lpush mylist B (integer) 2 127.0.0.1:6379> lpush mylist first (integer) 3 127.0.0.1:6379> lrange mylist 0 -1 1) "first" 2) "B" 3) "A" -- Blpop 命令移出第一個元素並返回列表的第一個元素. 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。下麵是移除了每一個first元素。 127.0.0.1:6379> blpop mylist 5 1) "mylist" 2) "first" 127.0.0.1:6379> lrange mylist 0 -1 1) "B" 2) "A" -- Brpop 命令移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。下麵二個元素,移除了最後一個。 127.0.0.1:6379> lrange mylist 0 -1 1) "B" 2) "A" 127.0.0.1:6379> brpop mylist 5 1) "mylist" 2) "A" 127.0.0.1:6379> lrange mylist 0 -1 1) "B" -- Brpoplpush 命令從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
-- 下麵mylist2列表獲取了mylist列表的一個元素 127.0.0.1:6379> brpoplpush mylist mylist2 5000 "B" --彈出一個值, 移到了mylist2中,設置超時時間 127.0.0.1:6379> lrange mylist 0 -1 (empty list or set) -- 空列表 127.0.0.1:6379> lrange mylist2 0 -1 1) "B" 2) "C" -- Lindex 命令用於通過索引獲取列表中的元素。你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。下麵獲取mylist2的第一個元素。 127.0.0.1:6379> lrange mylist2 0 -1 1) "B" 2) "C" 127.0.0.1:6379> lindex mylist2 0 "B"
-- Linsert 命令用於在列表的元素前或者後插入元素。格式: LINSERT key BEFORE|AFTER pivot value, 下麵將A插入到已有C元素的前面。 127.0.0.1:6379> linsert mylist2 before "C" "A" (integer) 3 127.0.0.1:6379> lrange mylist2 0 -1 1) "B" 2) "A" 3) "C"
--Llen 命令用於返回列表的長度。 127.0.0.1:6379> llen mylist2 (integer) 3 --Lpop 命令用於移除並返回列表的第一個元素 127.0.0.1:6379> lpop mylist2 "B" 127.0.0.1:6379> lrange mylist2 0 -1 1) "A" 2) "C" --Lpush 命令將一個或多個值插入到列表頭部, 上面有單個元素添加,還可以是多個元素添加,這裡不在演示。 --Lpushx 將一個或多個值插入到已存在的列表頭部。key的列表中必須要元素。 127.0.0.1:6379> lpushx mylist "A" (integer) 0 --添加失敗,因為mylist是空列表 127.0.0.1:6379> lrange mylist 0 -1 (empty list or set) 127.0.0.1:6379> lpush mylist A B (integer) 2 127.0.0.1:6379> lpushx mylist C (integer) 3 -- 添加成功。 127.0.0.1:6379> lrange mylist 0 -1 1) "C" 2) "B" 3) "A" -- Lrem 根據參數 COUNT 的值,移除列表中與參數 VALUE 相等的元素。 意思是列表中元素與value相等的,移除count個。 127.0.0.1:6379> lpush my "one" "two" "three" "one" (integer) 4 127.0.0.1:6379> lrange my 0 -1 1) "one" 2) "three" 3) "two" 4) "one" 127.0.0.1:6379> lrem my 1 "one" --移除1個one元素 (integer) 1 127.0.0.1:6379> lrange my 0 -1 1) "three" 2) "two" 3) "one" -- Lset 通過索引來設置元素的值。 127.0.0.1:6379> lrange my 0 -1 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> lset my 2 "four" OK -- 第三個元素的值從onw 改為了four 127.0.0.1:6379> lrange my 0 -1 1) "three" 2) "two" 3) "four" --Ltrim 對一個列表只保留指定區間內的元素。不在指定區間之內的元素都將被刪除。下標 0 表示列表的第一個元素,以 1 表示列表的第二個元素。 格式 LTRIM KEY_NAME START STOP 127.0.0.1:6379> lrange my 0 -1 1) "three" 2) "two" 3) "four" 127.0.0.1:6379> ltrim my 1 -1 OK -- 第一個元素將被刪除 127.0.0.1:6379> lrange my 0 -1 1) "two" 2) "four" -- Rpop 命令用於移除最後一個元素,並返回該元素. 127.0.0.1:6379> lrange my 0 -1 1) "two" 2) "four" 127.0.0.1:6379> rpop my "four" -- 移除最後一個元素 127.0.0.1:6379> lrange my 0 -1 1) "two" 其它: --Rpoplpush 命令用於移除列表的最後一個元素,並將該元素添加到另一個列表並返回。 --Rpush 命令用於將一個或多個值插入到列表的尾部(最右邊)。上面有單個元素添加,還可以是多個元素添加,這裡不在演示。 --Rpushx 命令用於將一個或多個值插入到已存在的列表尾部(最右邊)