zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

常用php操作redis命令整理(三)LIST类型详解编程语言

RedisPHPList命令编程语言 详解 操作 类型
2023-06-13 09:11:47 时间

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

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/17146.html

cjavaphp