LIST 整體結構圖
?
圖畫的太大了,只能放地址:
http://dl.iteye.com/upload/picture/pic/115935/8e96f42d-3a7b-3cea-85ae-997496aa9521.jpg
?
LIST列表的操作,可想而知,對于列表我們需要的具備的功能列表
加入列表:
? 從頭部加入 ? LPUSH?
? 從底部加入 ? RPUSH
彈出列表
? 從頭部彈出 ? LPOP
? 從底部彈出 ? RPOP
截取子列表 ? ? LRANGE
計算列表的長度 LLEN
?
?
實踐:
redis 127.0.0.1:6379> rpush l2 1 ? ? // 從底部添加一個元素
(integer) 1
redis 127.0.0.1:6379> rpush l2 2?
(integer) 2
redis 127.0.0.1:6379> lrange l2 0 -1 // 展示所有的元素 ?-1 代表所有
1) "1"
2) "2"
redis 127.0.0.1:6379> lpush l2 3?
(integer) 3
redis 127.0.0.1:6379> lrange l2 0 -1?
1) "3"
2) "1"
3) "2"
redis 127.0.0.1:6379> lpop l2 ? ? ? // 從頭部彈出一個元素
"3"
redis 127.0.0.1:6379> rpop l2 ? ? ? // 從尾部彈出一個元素
"2"
redis 127.0.0.1:6379> llen l2 ? ? ? // 計算隊列的長度
(integer) 1
?
擴展
1.1 LPUSHX ?當且隊列存在的情況下 在頭部插入數據?
?
LPUSHX key value
?
實踐:
redis 127.0.0.1:6379> LLEN empty1 ? ? ? ? ? ?
(integer) 0
redis 127.0.0.1:6379> lpushx empty1 hh ? ?// 將數據推入一個空的隊列,結果失敗
(integer) 0
redis 127.0.0.1:6379> lpush l3 hh?
(integer) 1
redis 127.0.0.1:6379> lpushx l3 hh2 ? ? ?// 將數據推入一個存在的隊列頭部,成功
(integer) 2
redis 127.0.0.1:6379> lrange l3 0 -1?
1) "hh2"
2) "hh"
?
1.2 RPUSHX 當且隊列存在的情況下 在尾部插入數據 ?基本同LPUSHX
redis 127.0.0.1:6379> rpushx empty1 hh3 ? ?// 嘗試將數據推入不存在隊列的尾部,失敗。
(integer) 0
redis 127.0.0.1:6379> rpushx l3 hh3 ? ? ? ?// 將數據推入存在隊列的尾巴,成功。
(integer) 3
redis 127.0.0.1:6379> lrange l3 0 -1
1) "hh2"
2) "hh"
3) "hh3"
?
1.3 BLPOP 對于LPOP的擴展 ,阻塞式的獲取數據
BLPOP key [key ...] timeout
?
它是 LPOP 命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被 BLPOP 命令阻塞,直到等待超時或發現可彈出元素為止。
當給定多個 key 參數時,按參數 key 的先后順序依次檢查各個列表,彈出第一個非空列表的頭元素。
?
假設現在有三個隊列 job 為空 , command ?request 不為空 。那么就開始輪訓所有的key ,若是空,則跳過 。執行順序為 job ==> command ==> request
?
實踐:
redis 127.0.0.1:6379> del job?
(integer) 0
redis 127.0.0.1:6379> lpush command hh?
(integer) 1
redis 127.0.0.1:6379> lpush request kk?
(integer) 1
redis 127.0.0.1:6379> blpop job command kk?
(error) ERR timeout is not an integer or out of range
redis 127.0.0.1:6379> blpop job command kk ?100?
1) "command"
2) "hh"
redis 127.0.0.1:6379>
?
查看其是如何阻塞的
在第一個圖片中,上面那個終端一直阻塞著。

?
在第二個終端中輸入數據后,上面終端取得數據并返回。

?
1.4 BRPOP 對于rpop的擴展,原理基本同BLPOP
?
2.LREM
語法:LREM key count value
釋義:根據參數 count 的值,移除列表中與參數 value 相等的元素。
count 的值可以是以下幾種:
? count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量為 count 。
? count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量為 count 的絕對值。
? count = 0 : 移除表中所有與 value 相等的值。
?
實踐:
redis 127.0.0.1:6379> lpush l1 hello?
(integer) 1
redis 127.0.0.1:6379> lpush l1 world?
(integer) 2
redis 127.0.0.1:6379> lpush l1 hello?
(integer) 3
redis 127.0.0.1:6379> lpush l1 world?
(integer) 4
redis 127.0.0.1:6379> lpush l1 hello?
(integer) 5
redis 127.0.0.1:6379> lrange l1 0 -1?
1) "hello"
2) "world"
3) "hello"
4) "world"
5) "hello"
redis 127.0.0.1:6379> ? ? ? ? ? ? ? ? ? ? ? // 數據準備完成
?
redis 127.0.0.1:6379> lrem l1 2 hello ? ? ?// 從頭部開始掃描,移除了兩個hello?
(integer) 2
redis 127.0.0.1:6379> lrem l1 -1 hello ? ? // 從尾部開始掃描,移除了一個hello
(integer) 1
redis 127.0.0.1:6379> lrange l1 0 -1 ? ? ? // 現在只剩下 world了
1) "world"
2) "world"
redis 127.0.0.1:6379> lrem l1 0 world ? ? // 移除隊中所有的world?
(integer) 2
redis 127.0.0.1:6379> lrange l1 0 -1 ? ? ?// 已經被清空了。
(empty list or set)
redis 127.0.0.1:6379>?
?
3.LSET
語法:LSET key index value
釋義:將列表 key 下標為 index 的元素的值設置為 value 。
實踐:
redis 127.0.0.1:6379> lpush l1 hello?
(integer) 1
redis 127.0.0.1:6379> lpush l1 world?
(integer) 2
redis 127.0.0.1:6379> lset l1 1 ?--- ? ? ?// 下標為1的數據被替換成 --- 了
OK
redis 127.0.0.1:6379> lrange l1 0 -1
1) "world"
2) "---"
redis 127.0.0.1:6379> lset l1 3 hh ? ? ? // 超出下標進行設置的話,報錯
(error) ERR index out of range
redis 127.0.0.1:6379> exist l2?
(error) ERR unknown command 'exist'
redis 127.0.0.1:6379> exists l2 ? ? ? ? ?// 對不存在的隊列進行設置的話,報錯
(integer) 0
redis 127.0.0.1:6379> lset l2 0 hh?
(error) ERR no such key
redis 127.0.0.1:6379>?
?
?
4 LTRIM
語法:LTRIM key start stop
釋義:對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
?超出范圍的下標值不會引起錯誤。
?如果 start 下標比列表的最大下標 end ( LLEN list 減去 1 )還要大,或者 start > stop , LTRIM 返回一個空列表(因為 LTRIM 已經將整個列表清空)。
?如果 stop 下標比 end 下標還要大,Redis將 stop 的值設置為 end?
?
實踐:
redis 127.0.0.1:6379> lrange l1 0 -1 ? ?// 新建一個隊列?
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"
redis 127.0.0.1:6379> ltrim l1 0 3 ? ? // 只截取前四個?
OK
redis 127.0.0.1:6379> lrange l1 0 -1
1) "h"
2) "e"
3) "l"
4) "l"
redis 127.0.0.1:6379> ltrim l1 0 10 ? ?// stop下標大于隊列長度 則 stop=隊列長度
OK
redis 127.0.0.1:6379> lrange l1 0 -1
1) "h"
2) "e"
3) "l"
4) "l"
redis 127.0.0.1:6379> lset l1 10 20 ?// start stop 都大于 隊列長度 且 start < stop 清空隊列
(empty list or set)
redis 127.0.0.1:6379> ltrim l1 3 1 ? ? // start ?< stop 清空隊列
OK
redis 127.0.0.1:6379> lrange l1 10 20?
(empty list or set)
?
5.LINDEX
語法:LINDEX key index
釋義:返回列表 key 中,下標為 index 的元素。
?下標(index)參數 start 和 stop 都以 0 為底,也就是說,以 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。
?你也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。
?
實踐:
redis 127.0.0.1:6379> lpush l1 1?
(integer) 1
redis 127.0.0.1:6379> lpush l1 2
(integer) 2
redis 127.0.0.1:6379> lpush l1 3
(integer) 3
redis 127.0.0.1:6379> lindex l1 0 ? ? ? ? ? ?// 取下標為0的數據
"3"
redis 127.0.0.1:6379> lrange l1 0 -1?
1) "3"
2) "2"
3) "1"
redis 127.0.0.1:6379> lindex l1 -1 ? ? ? ? ?// 取最后一個數據
"1"
redis 127.0.0.1:6379>?
?
6. LINSERT ?類似于LSET,一個是根據下標來插入,一個是根據pivot來插入數據。
語法:LINSERT key BEFORE|AFTER pivot value
釋義:將值 value 插入到列表 key 當中,位于值 pivot 之前或之后。
? 當 pivot 不存在于列表 key 時,不執行任何操作。
? 當 key 不存在時, key 被視為空列表,不執行任何操作。
? 如果 key 不是列表類型,返回一個錯誤。
?
實踐:
redis 127.0.0.1:6379> lrange l1 0 -1?
1) "redis"
2) "hello"
3) "world"
4) "hello"
redis 127.0.0.1:6379> linsert l1 after hello after-insert ? ? ? ? ?// 在第一個找到的hello后面插入了一個數據?
(integer) 5
redis 127.0.0.1:6379> lrange l1 0 -1?
1) "redis"
2) "hello"
3) "after-insert"
4) "world"
5) "hello"
redis 127.0.0.1:6379> linsert l1 before hello before-insert ? ? ? // 在第一個找到的hello前面插入了一個數據?
(integer) 6
redis 127.0.0.1:6379> lrange l1 0 -1?
1) "redis"
2) "before-insert"
3) "hello"
4) "after-insert"
5) "world"
6) "hello"
redis 127.0.0.1:6379> linsert l1 before hoho before-insert ? ? ? // 對于 pivot 不存在的列表,插入失敗
(integer) -1
redis 127.0.0.1:6379> lrange l1 0 -1?
1) "redis"
2) "before-insert"
3) "hello"
4) "after-insert"
5) "world"
6) "hello"
redis 127.0.0.1:6379> linsert l2 before hoho before-insert ? ? ? // 插入一個空列表,直接報錯
(integer) 0
?
7. RPOPLPUSH?
語法:RPOPLPUSH source destination
釋義:
命令 RPOPLPUSH 在一個原子時間內,執行以下兩個動作:
?將列表 source 中的最后一個元素(尾元素)彈出,并返回給客戶端。
?將 source 彈出的元素插入到列表 destination ,作為 destination 列表的的頭元素。
舉個例子,你有兩個列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,執行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 會被返回給客戶端。
?如果 source 不存在,值 nil 被返回,并且不執行其他動作。
?如果 source 和 destination 相同,則列表中的表尾元素被移動到表頭,并返回該元素,可以把這種特殊情況視作列表的旋轉(rotation)操作。
?
實踐:
redis 127.0.0.1:6379> lrange l1 0 -1?
1) "c"
2) "b"
3) "a"
redis 127.0.0.1:6379> lrange l2 0 -1
1) "3"
2) "2"
3) "1"
redis 127.0.0.1:6379> rpoplpush l1 l2 ? ? //將l1尾部的數據彈出進入l2的頭部,并將這個彈出的數據返回
"a"
redis 127.0.0.1:6379> lrange l1 0 -1?
1) "c"
2) "b"
redis 127.0.0.1:6379> lrange l2 0 -1?
1) "a"
2) "3"
3) "2"
4) "1"
redis 127.0.0.1:6379>
?
8. BRPOPLPUSH?
語法:BRPOPLPUSH source destination timeout
釋義:BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,當給定列表 source 不為空時, BRPOPLPUSH 的表現和 RPOPLPUSH 一樣。
? ?當列表 source 為空時, BRPOPLPUSH 命令將阻塞連接,直到等待超時,或有另一個客戶端對 source 執行 LPUSH 或 RPUSH 命令為止。
? ?超時參數 timeout 接受一個以秒為單位的數字作為值。超時參數設為 0 表示阻塞時間可以無限期延長(block indefinitely) 。
?
實踐:
我們設置等超時時間為1000?

?
在另一個客戶端添加數據后,就轉移了數據

?
?
?
已有 0 人發表留言,猛擊->>這里<<-參與討論
ITeye推薦