常用php操作redis命令整理(三)LIST类型详解编程语言
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相关文章
- PHP与redis队列实现电商订单自动确认收货
- PHP在MySQL中实现安全的表单提交(php表单提交mysql)
- Redis的常见错误及解决方案(redis常见错误)
- PHP中实现Redis队列的挑战与实践(php队列redis)
- 内存占用Linux下检查Redis内存使用量(linux查看redis)
- PHP与Redis出色的结合(php连redis)
- PHP开启Redis:实现快速访问(php开启redis)
- 实现缓存PHP开启Redis超越缓存技术(php开启redis)
- PHP中Redis的应用场景(redis应用场景PHP)
- PHP中的Redis类:快速高效地管理数据(redis类php)
- PHP实现Redis监控的简便方法(php监控redis)
- 用Redis作为PHP缓存:提高性能和效率(php中redis做缓存)
- PHP封装Redis:提高工作效率(封装php redis)
- 基于PHP的Redis视频教程(redis视频教程php)
- 的优势玩转Redis:List缓存的有点优势(redis 缓存list)
- 深入浅出Redis的List数据结构遍历(遍历redis list)
- 探索Redis我的第一次(第一次接触redis)
- 抢到手软秒杀PHP使用Redis进行流量管理(秒杀php用redis)
- 使用Redis管理用户登录信息增强安全性,轻松登录Redis解决方案(登陆放到redis)
- 架构师开展Redis测试,稳步提升性能(架构师redis测试)
- 成功将商品添加到Redis中(添加商品到redis中)
- 测试深入洞悉Redis究竟是什么(测试redis是什么)
- 采用Redis刷新缓存,提升程序性能(刷缓存redis)
- Redis解决高并发的弯路及思路(redis高并发当机)
- Redis与PHP结合极致无限可能(redis 集合 php)
- 利用PHP实现Redis队列任务的并发处理(redis队列任务php)
- 如何配置Redis第几个数据库(redis配置第几个库)
- Redis订阅发布优点与缺点(redis订阅发布优缺点)
- Redis实现获取记录总数的方法(redis获取记录总数)
- 调整基于Redis的连接数大小如何调整(redis连接数大小如何)
- 优化Redis性能配置技巧大全(redis配置性能优化)
- 中的应用使用Redis,提升PHP程序效率(redis缓存在php)
- 以Redis为中心 轻松实现PHP消息订阅(redis消息订阅php)