標籤:list redis
list是一個內部採用雙向鏈表(double linked list) 結構,像列表兩端添加元素的時間複雜度為O(1)。主要功能是push、pop、擷取一個範圍的所有值等,操作中key理解為鏈表的名字。
鏈表的最大長度是(2的32次方)。我們可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊列。
list的pop操作均有阻塞版本的,當我們[lr]pop一個list對象時,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加逾時時間,逾時後也會返回nil。為什麼要阻塞版本的pop呢,主要是為了避免輪詢。
舉個簡單的例子如果我們用list來實現一個工作隊列。執行任務的thread可以調用阻塞版本的pop去擷取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候背景工作執行緒可以立即返回,也可以避免輪詢帶來的延遲。
LPUSH Key value 左邊插入
RPUSH Key value 右邊插入
LPop key 左邊彈出
RPop key 右邊彈出
BLPOP,BRPOP阻塞式左/右彈出
lpush
129.223.248.154:6379> lpush members ben
(integer) 1
129.223.248.154:6379> lpush members jeff
(integer) 2
129.223.248.154:6379> lpush members mike jeme
(integer) 6
lpop
129.223.248.154:6379> lpop members
"raymond"
129.223.248.154:6379> rpop members
"ben"
llen
129.223.248.154:6379> llen members
(integer) 4
lrange (lrange firstqueue 0 -1 列出list中全部元素值)
129.223.248.154:6379> lrange members 0 2
1) "richard"
2) "jemery"
3) "mike"
129.223.248.154:6379> llen members
(integer) 4
129.223.248.154:6379> lrange members 0 3
1) "richard"
2) "jemery"
3) "mike"
4) "jeff"
129.223.248.154:6379> lrange members 0 4
1) "richard"
2) "jemery"
3) "mike"
4) "jeff"
129.223.248.154:6379> lrange members 0 -1
1) "richard"
2) "jemery"
3) "mike"
4) "jeff"
5) "derek"
rpop
129.223.248.154:6379> rpop members
"derek"
129.223.248.154:6379> lpop members
"richard"
129.223.248.154:6379> lrange members 0 -1
1) "jemery"
2) "mike"
3) "jeff"
lindex
129.223.248.154:6379> lindex members 1
"mike"
129.223.248.154:6379> llen members
(integer) 3
129.223.248.154:6379> rpush firstqueue 3 2 1
(integer) 3
129.223.248.154:6379> lrange firstqueue 0 -1
1) "3"
2) "2"
3) "1"
129.223.248.154:6379> lpush secqueue 3 2
(integer) 2
129.223.248.154:6379> lrange secqueue 0 -1
1) "2"
2) "3"
rpoplpush 從第一個list的尾部移除元素並添加到第二個list的頭部,最後返回被移除的元素值,整個操作是原子的.如果第一個list是空或者不存在返回nil
129.223.248.154:6379> rpoplpush firstqueue secqueue
"1"
129.223.248.154:6379> lrange firstqueue 0 -1
1) "3"
2) "2"
129.223.248.154:6379> lrange secqueue 0 -1
1) "1"
2) "2"
3) "3"
129.223.248.154:6379>
本文出自 “軟體設計與開發” 部落格,請務必保留此出處http://yuanzhitang.blog.51cto.com/2769219/1789582
[Redis Chapter 6] List