天天看點

Redis基礎教程第6節 List

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&gt; lpush members ben</code>

<code>(integer) 1</code>

<code>129.223.248.154:6379&gt; lpush members jeff</code>

<code>(integer) 2</code>

<code>129.223.248.154:6379&gt; lpush members mike jeme</code>

<code>(integer) 6</code>

lpop

<code>129.223.248.154:6379&gt; lpop members</code>

<code>"raymond"</code>

<code>129.223.248.154:6379&gt; rpop members</code>

<code>"ben"</code>

llen

<code>129.223.248.154:6379&gt; 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&gt; 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&gt; lrange members 0 3</code>

<code>4) </code><code>"jeff"</code>

<code>129.223.248.154:6379&gt; lrange members 0 4</code>

<code>129.223.248.154:6379&gt; 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&gt; lindex members 1</code>

<code>"mike"</code>

<code>(integer) 3</code>

<code>129.223.248.154:6379&gt; rpush firstqueue 3 2 1</code>

<code>129.223.248.154:6379&gt; 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&gt; lpush secqueue 3 2</code>

<code>129.223.248.154:6379&gt; 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&gt; 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&gt;</code>

<code></code>

本文轉自 yuanzhitang 51CTO部落格,原文連結:http://blog.51cto.com/yuanzhitang/1789582,如需轉載請自行聯系原作者

繼續閱讀