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
1
2
3
4
5
6
<code>129.223.248.154:6379> lpush members ben</code>
<code>(integer) 1</code>
<code>129.223.248.154:6379> lpush members jeff</code>
<code>(integer) 2</code>
<code>129.223.248.154:6379> lpush members mike jeme</code>
<code>(integer) 6</code>
lpop
<code>129.223.248.154:6379> lpop members</code>
<code>"raymond"</code>
<code>129.223.248.154:6379> rpop members</code>
<code>"ben"</code>
llen
<code>129.223.248.154:6379> llen members</code>
<code>(integer) 4</code>
lrange (lrange firstqueue 0 -1 列出list中全部元素值)
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<code>129.223.248.154:6379> lrange members 0 2</code>
<code>1) </code><code>"richard"</code>
<code>2) </code><code>"jemery"</code>
<code>3) </code><code>"mike"</code>
<code>129.223.248.154:6379> lrange members 0 3</code>
<code>4) </code><code>"jeff"</code>
<code>129.223.248.154:6379> lrange members 0 4</code>
<code>129.223.248.154:6379> lrange members 0 -1</code>
<code>5) </code><code>"derek"</code>
rpop
<code>"derek"</code>
<code>"richard"</code>
<code>1) </code><code>"jemery"</code>
<code>2) </code><code>"mike"</code>
<code>3) </code><code>"jeff"</code>
lindex
<code>129.223.248.154:6379> lindex members 1</code>
<code>"mike"</code>
<code>(integer) 3</code>
<code>129.223.248.154:6379> rpush firstqueue 3 2 1</code>
<code>129.223.248.154:6379> lrange firstqueue 0 -1</code>
<code>1) </code><code>"3"</code>
<code>2) </code><code>"2"</code>
<code>3) </code><code>"1"</code>
<code>129.223.248.154:6379> lpush secqueue 3 2</code>
<code>129.223.248.154:6379> lrange secqueue 0 -1</code>
<code>1) </code><code>"2"</code>
<code>2) </code><code>"3"</code>
rpoplpush 從第一個list的尾部移除元素并添加到第二個list的頭部,最後傳回被移除的元素值,整個操作是原子的.如果第一個list是空或者不存在傳回nil
<code>129.223.248.154:6379> rpoplpush firstqueue secqueue</code>
<code>"1"</code>
<code>1) </code><code>"1"</code>
<code>3) </code><code>"3"</code>
<code>129.223.248.154:6379></code>
<code></code>
本文轉自 yuanzhitang 51CTO部落格,原文連結:http://blog.51cto.com/yuanzhitang/1789582,如需轉載請自行聯系原作者