LIST
頭元素和尾元素:頭元素指的是列表左端/前端第一個元素,尾元素指的是列表右端/後端第一個元素。舉個例子,列表list包含三個元素:x, y, z,其中x是頭元素,而z則是尾元素。
空列表:指不包含任何元素的列表,Redis將不存在的key也視為空列表。
LPUSH
將一個或多個值value插入到列表key的表頭。如果key不存在,一個空列表會被建立並執行LPUSH操作。
<?php
var_dump($redis->lpush('list-key','A')); //插入連結串列頭部/左側,返回連結串列長度 int(1)
var_dump($redis->lpush('list-key','B')); //插入連結串列頭部/左側,返回連結串列長度 int(2)
var_dump($redis->lpush('list-key','C','D')); //插入連結串列頭部/左側,返回連結串列長度 int(4)
RPUSH
將一個或多個值value插入到列表key的表尾。如果key不存在,一個空列表會被建立並執行LPUSH操作。
<?php
var_dump($redis->rpush('list-key','A')); //插入連結串列尾部/右側,返回連結串列長度int(1)
var_dump($redis->rpush('list-key','B')); //插入連結串列尾部/右側,返回連結串列長度int(2)
var_dump($redis->rpush('list-key','C','D')); //插入連結串列尾部/右側,返回連結串列長度 int(4)
LPUSHX
插入連結串列頭部/左側,連結串列不存在返回0,存在即插入成功,返回當前連結串列長度
<?php
var_dump($redis->lpushx('list-key', 'E')); //int(5)
RPUSHX
插入連結串列尾部/右側,連結串列不存在返回0,存在即插入成功,返回當前連結串列長度
<?php
var_dump($redis->rpushx('list-key', 'E')); //int(5)
LPOP
移除並返回列表key的頭元素,當key不存在時,返回nil。
<?php
$redis->lpush('list-key','A'); //插入連結串列頭部/左側,返回連結串列長度 int(1) $redis->lpush('list-key','B'); //插入連結串列頭部/左側,返回連結串列長度 int(2) $redis->lpush('list-key','C','D'); //插入連結串列頭部/左側,返回連結串列長度 int(4) var_dump($redis->lpop('list-key')); // string(1) "D"
RPOP
移除並返回列表key的尾元素,當key不存在時,返回nil。
<?php
$redis->lpush('list-key','A'); //插入連結串列頭部/左側,返回連結串列長度 int(1)
$redis->lpush('list-key','B'); //插入連結串列頭部/左側,返回連結串列長度 int(2)
$redis->lpush('list-key','C','D'); //插入連結串列頭部/左側,返回連結串列長度 int(4)
var_dump($redis->rpop('list-key')); //string(1) "A"
LLEN/LSIZE
返回列表key的長度;如果key不存在,則key被解釋為一個空列表,返回0.如果key不是列表型別,返回一個錯誤。
<?php
var_dump($redis->lsize('list-key')); //int(3)
var_dump($redis->llen('list-key')); //int(3)
LRANGE
返回列表key中指定區間內的元素,區間以偏移量start和stop指定。下標(index)引數start和stop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素,以此類推。結束位置為-1 獲取開始位置之後的全部
<?php
var_dump($redis->lrange('list-key',0,1)); //array(2) { [0]=> string(1) "D" [1]=> string(1) "C" }
var_dump($redis->lrange('list-key',0,-1)); //array(3) { [0]=> string(1) "D" [1]=> string(1) "C" [2]=> string(1) "B" }
LREM
根據引數count的值,移除列表中與引數value相等的元素。
$redis->lpush('list-key','A'); //插入連結串列頭部/左側,返回連結串列長度 int(1)
$redis->lpush('list-key','B'); //插入連結串列頭部/左側,返回連結串列長度 int(2)
$redis->lpush('list-key','C','D','C','A','D','E','A','D','E'); //插入連結串列頭部/左側,返回連結串列長度 int(4)
var_dump($redis->lrange('list-key',0,-1));
//array(11) {
[0]=>
string(1) "E"
[1]=>
string(1) "D"
[2]=>
string(1) "A"
[3]=>
string(1) "E"
[4]=>
string(1) "D"
[5]=>
string(1) "A"
[6]=>
string(1) "C"
[7]=>
string(1) "D"
[8]=>
string(1) "C"
[9]=>
string(1) "B"
[10]=>
string(1) "A"
}
var_dump($redis->lrem('list-key','A',2)); // 連結串列從左開始刪除元素2個A ; int(2)
//array(9) {
[0]=>
string(1) "E"
[1]=>
string(1) "D"
[2]=>
string(1) "E"
[3]=>
string(1) "D"
[4]=>
string(1) "C"
[5]=>
string(1) "D"
[6]=>
string(1) "C"
[7]=>
string(1) "B"
[8]=>
string(1) "A"
}
LSET
將列表key下標為index的元素的值甚至為value。
<?php
$redis->lpush('list-key','A'); //插入連結串列頭部/左側,返回連結串列長度 int(1)
$redis->lpush('list-key','B'); //插入連結串列頭部/左側,返回連結串列長度 int(2)
var_dump($redis->lset('list-key',1,'D')); // bool(true)
var_dump($redis->lrange('list-key',0,-1)); array(2) { [0]=> string(1) "B" [1]=> string(1) "D" }
LTRIM
對一個列表進行修剪(trim),讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
舉個例子,執行命令LTRIM list 0 2,表示只保留列表list的前三個元素,其餘元素全部刪除。
下標(index)引數start和stop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素
<?php
$redis->lpush('list-key','A'); //插入連結串列頭部/左側,返回連結串列長度 int(1)
$redis->lpush('list-key','B'); //插入連結串列頭部/左側,返回連結串列長度 int(2)
$redis->lpush('list-key','C','D','E'); //插入連結串列頭部/左側,返回連結串列長度 int(4)
var_dump($redis->ltrim('list-key',2,3)); // bool(true)
var_dump($redis->lrange('list-key',0,-1));//array(2) { [0]=> string(1) "C" [1]=> string(1) "B" }
LINDEX
返回列表key中,下標為index的元素
<?php
$redis->lpush('list-key','A'); //插入連結串列頭部/左側,返回連結串列長度 int(1)
$redis->lpush('list-key','B'); //插入連結串列頭部/左側,返回連結串列長度 int(2)
$redis->lpush('list-key','C','D','E'); //插入連結串列頭部/左側,返回連結串列長度 int(4)
var_dump($redis->lindex('list-key',3));//string(1) "B"
LINSERT
將值value插入到列表key當中,位於值pivot之前或之後。當pivot不存在於列表key時,不執行任何操作。當key不存在時,key被視為空列表,不執行任何操作。
Redis::AfTER(表示後面插入)
<?php $redis->lpush('list-key','A'); //插入連結串列頭部/左側,返回連結串列長度 int(1) $redis->lpush('list-key','B'); //插入連結串列頭部/左側,返回連結串列長度 int(2) $redis->lpush('list-key','C','D','E'); //插入連結串列頭部/左側,返回連結串列長度 int(4) var_dump($redis->linsert('list-key',Redis::BEFORE,'C','X')); var_dump($redis->lrange('list-key',0,-1));
//array(6) { [0]=> string(1) "E" [1]=> string(1) "D" [2]=> string(1) "X" [3]=> string(1) "C" [4]=> string(1) "B" [5]=> string(1) "A" }
RPOPLPUSH
命令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的列表經常被用作佇列(queue),用於在不同程式之間有序地交換訊息(message)。一個程式(稱之為生產者,producer)通過LPUSH命令將訊息放入佇列中,而另一個程式(稱之為消費者,consumer)通過RPOP命令取出佇列中等待時間最長的訊息。
不幸的是,在這個過程中,一個消費者可能在獲得一個訊息之後崩潰,而未執行完成的訊息也因此丟失。
使用RPOPLPUSH命令可以解決這個問題,因為它在返回一個訊息之餘,還將該訊息新增到另一個列表當中,另外的這個列表可以用作訊息的備份表:假如一切正常,當消費者完成該訊息的處理之後,可以用LREM命令將該訊息從備份表刪除。
另一方面,助手(helper)程式可以通過監視備份表,將超過一定處理時限的訊息重新放入佇列中去(負責處理該訊息的消費者可能已經崩潰),這樣就不會丟失任何訊息了。
<?php
$redis->lpush('list-key','A');
$redis->lpush('list-key','B');
$redis->lpush('list-key','C','D','E');
$redis->lpush('list-key2','X','Y','Z');
var_dump($redis->rpoplpush('list-key','list-key2')); //string(1) "A"
var_dump($redis->lrange('list-key',0,-1));// array(4) { [0]=> string(1) "E" [1]=> string(1) "D" [2]=> string(1) "C" [3]=> string(1) "B" }
var_dump($redis->lrange('list-key2',0,-1));//array(4) { [0]=> string(1) "A" [1]=> string(1) "Z" [2]=> string(1) "Y" [3]=> string(1) "X" }