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',,)); //array(2) { [0]=> string(1) "D" [1]=> string(1) "C" }
var_dump($redis->lrange('list-key',,-)); //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',,-));
//array(11) {
[]=>
string() "E"
[]=>
string() "D"
[]=>
string() "A"
[]=>
string() "E"
[]=>
string() "D"
[]=>
string() "A"
[]=>
string() "C"
[]=>
string() "D"
[]=>
string() "C"
[]=>
string() "B"
[]=>
string() "A"
}
var_dump($redis->lrem('list-key','A',)); // 链表从左开始删除元素2个A ; int(2)
//array(9) {
[]=>
string() "E"
[]=>
string() "D"
[]=>
string() "E"
[]=>
string() "D"
[]=>
string() "C"
[]=>
string() "D"
[]=>
string() "C"
[]=>
string() "B"
[]=>
string() "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',,'D')); // bool(true)
var_dump($redis->lrange('list-key',,-)); array() { []=> string() "B" []=> string() "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',,)); // bool(true)
var_dump($redis->lrange('list-key',,-));//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',));//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',,-)); //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',,-));// array(4) { [0]=> string(1) "E" [1]=> string(1) "D" [2]=> string(1) "C" [3]=> string(1) "B" }
var_dump($redis->lrange('list-key2',,-));//array(4) { [0]=> string(1) "A" [1]=> string(1) "Z" [2]=> string(1) "Y" [3]=> string(1) "X" }

常用php操作redis命令整理(三)LIST类型的更多相关文章

  1. 常用php操作redis命令整理(一)通用及字符串类型

    Key相关操作 TYPE 类型检测,字符串返回string,列表返回 list,set表返回set/zset,hash表返回hash,key不存在返回0 <?php echo $redis-&g ...

  2. 常用php操作redis命令整理(二)哈希类型

    HSET将哈希表key中的域field的值设为value;如果field是哈希表中的一个新建域,并且值设置成功,返回1;如果哈希表中域field已经存在且旧值已被新值覆盖,返回0. <?php ...

  3. 常用php操作redis命令整理(五)ZSET类型

    ZADD 向有序集合插入一个元素,元素关联一个数值,插入成功返回1,同时集合元素不可以重复, 如果元素已经存在返回 0 <?php var_dump($redis->zadd(,'A')) ...

  4. 常用php操作redis命令整理(四)SET类型

    SADD 将一个或多个member元素加入到集合key当中.(从左侧插入,最后插入的元素在0位置),集合中已经存在TK 则返回false,不存在添加成功 返回true <?php var_dum ...

  5. Windows常用的一些DOS命令整理

    Windows常用的一些DOS命令整理.. MS DOS 命令大全 ---清空Dos屏幕使用命令:cls -- Dos切换当前目录到D盘:cd d: 一.基础命令 1 dir 无参数:查看当前所在目录 ...

  6. python操作Redis安装、支持存储类型、普通连接、连接池

    一.python操作redis安装和支持存储类型 安装redis模块 pip3 install redis 二.Python操作Redis之普通连接 redis-py提供两个类Redis和Strict ...

  7. 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表

    python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...

  8. 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型

    第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...

  9. python操作redis命令

    Python操作redis from redis import StrictRedis, ConnectionPoolredis_url="redis://:xxxx@112.27.10.1 ...

随机推荐

  1. PHP创建文件以及移动文件

    创建文件,这里用到的是fopen,即是打开,又是创建 <?php $counter_file = 'aa.txt ';//文件名及路径,在当前目录下新建aa.txt文件 $fopen = fop ...

  2. poj_1182 并查集

    题目大意 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人 ...

  3. jquery类似方法的比较(一)

    1. $(div + p) & $(div ~ p) & $(div p) & $(div > p) $(div + p)选择紧挨在div后面的P元素 $(div ~ p ...

  4. sencha touch 入门系列 (三)sencha touch 项目创建

    通过上一章节的学习,我们的开发环境已经配置好了,接下来我们开始创建第一个sencha touch的项目,网络上很多sencha touch的教程都是手动搭建项目的, 不过手动搭建的项目缺少一些senc ...

  5. android 点九工具介绍

    1=============================9.png简介:“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png android平台有多种不同的 ...

  6. tarjan算法求缩点+树形DP求直径

    hdu4612 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  7. Java导出Excel表,POI 实现合并单元格以及列自适应宽度(转载)

    POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是: sheet.addMergedRegion(new CellRangeAddress ...

  8. apache+tomcat负载均衡3种实现方式

    1.首先安装apache,编译完成后,通过IP:端口就行访问,如果返回“it workers”证明Apache启动成功(注意apache的工程路径要正确) 2.下载JK,下载地址为http://mir ...

  9. [ASP.NET 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

    在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...

  10. opencv学习笔记——minMaxIdx函数的含义及用法

    opencv中有时需要对Mat数据需要对其中的数据求取最大值和最小值.opencv提供了直接的函数 CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT ...