常用php操作redis命令整理(三)LIST型別

OldBoy~發表於2018-01-24

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" }

 

相關文章