redis命令操作list和php语法对照

本文为我阅读了** redis参考手册 **之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法)

目录:

序号 方法 说明 php
1 BLPOP key1 [key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 $redis -> blPop('favorite_fruit',3)
2 BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 $redis -> brPop('favorite_fruit',3)
3 BRPOPLPUSH source destination timeout 列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 $redis -> brpoplpush('favorite_fruit','favorite_fruit',2)
4 LINDEX key index 通过索引获取列表中的元素 $redis -> lIndex('favorite_fruit',2)
5 LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素 $redis -> lInsert('favorite_fruit','before','apple','Mango')
6 LLEN key 获取列表长度 $redis -> lLen('favorite_fruit')
7 LPOP key 移出并获取列表的第一个元素 $redis -> lPop('favorite_fruit')
8 LPUSH key value1 [value2] 将一个或多个值插入到列表头部 $redis -> lPush('favorite_fruit','banana')
9 LPUSHX key value 将一个值插入到已存在的列表头部 $redis -> lPushx('favorite_fruit','apple'));
10 LRANGE key start stop 获取列表指定范围内的元素 $redis -> lRange('favorite_fruit',0,-1));
11 LREM key count value 移除列表元素 $redis -> lRem('favorite_fruit','apple',2)
12 LSET key index value 通过索引设置列表元素的值 $redis -> lSet('favorite_fruit','1','pineapple')
13 LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 $redis -> lTrim('favorite_fruit',1,-1)
14 RPOP key 移除列表的最后一个元素,返回值为移除的元素。 $redis -> rPop('favorite_fruit')
15 RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 $redis -> rpoplpush('favorite_fruit','favorite_fruit')
16 RPUSH key value1 [value2] 在列表中添加一个或多个值 $redis -> rPush('favorite_fruit','cherry')
17 RPUSHX key value 为已存在的列表添加值 $redis -> rPushx('favorite_fruit','apple')

一、List(列表)

1、LPUSH

Redis Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。(在Redis 2.4版本以前的 LPUSH 命令,都只接受单个 value 值。)

语法:

redis 127.0.0.1:6379> LPUSH KEY_NAME VALUE1.. VALUEN

返回值: 执行 LPUSH 命令后,列表的长度。

可用版本: >= 1.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

var_dump($redis -> lPush('favorite_fruit','cherry'));     // key 不存在,创建一个新的列表, 返回 int 1
var_dump($redis -> lPush('favorite_fruit','banana'));     // key 存在。但是 list 类型, 返回 int 2

$redis -> set('pats','dog');
var_dump($redis -> lPush('pats','cat'));     // key 存在。但不是是 list 类型, 返回 boolean false

2、LPUSHX

Redis Lpushx 将一个或多个值插入到已存在的列表头部,列表不存在时操作无效。

语法:

redis 127.0.0.1:6379> LPUSHX KEY_NAME VALUE1.. VALUEN

返回值: LPUSHX 命令执行之后,列表的长度。

可用版本: >= 2.2.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

var_dump($redis -> rPush('favorite_fruit','cherry'));
var_dump($redis -> rPush('favorite_fruit','banana'));
var_dump($redis -> lPushx('favorite_fruit','apple'));     //  返回 int 3
var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=3)
//      0 => string 'apple' (length=5)
//      1 => string 'cherry' (length=6)
//      2 => string 'banana' (length=6)

var_dump($redis -> lPushx('fake_key','invalid_val'));     //  列表不存在时操作无效返回 int (0)

3、RPUSH

Redis Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。(注意:在 Redis 2.4 版本以前的 RPUSH 命令,都只接受单个 value 值)。

语法:

redis 127.0.0.1:6379> RPUSH KEY_NAME VALUE1..VALUEN

返回值: 执行 RPUSH 操作后,列表的长度。

可用版本: >= 1.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

var_dump($redis -> rPush('favorite_fruit','cherry'));     // key 不存在,创建一个新的列表, 返回 int 1
var_dump($redis -> rPush('favorite_fruit','banana'));     // key 存在。但是 list 类型, 返回 int 2

$redis -> set('pats','dog');
var_dump($redis -> rPush('pats','cat'));     // key 存在。但不是是 list 类型, 返回 boolean false

4、RPUSHX

Redis Rpushx 命令用于将一个或多个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效。

语法:

redis 127.0.0.1:6379> RPUSHX KEY_NAME VALUE1..VALUEN

返回值:执行 Rpushx 操作后,列表的长度。

可用版本: >= 2.2.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

var_dump($redis -> lPush('favorite_fruit','cherry'));
var_dump($redis -> lPush('favorite_fruit','banana'));
var_dump($redis -> rPushx('favorite_fruit','apple'));     //  返回 int 3
var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=3)
//      0 => string 'banana' (length=6)
//      1 => string 'cherry' (length=6)
//      2 => string 'apple' (length=5)

var_dump($redis -> rPushx('fake_key','invalid_val'));     //  列表不存在时操作无效返回 int (0)

5、LPOP

Redis Lpop 命令用于移除并返回列表的第一个元素。

语法:

redis 127.0.0.1:6379> LPOP KEY_NAME

返回值:列表的第一个元素。 当列表 key 不存在时,返回 nil 。

可用版本:>= 1.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

var_dump($redis -> lPush('favorite_fruit','cherry'));
var_dump($redis -> lPush('favorite_fruit','banana'));
var_dump($redis -> lPush('favorite_fruit','apple'));
var_dump($redis -> lPop('favorite_fruit'));             // string apple
var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=2)
//      0 => string 'banana' (length=6)
//      1 => string 'cherry' (length=6)

6、RPOP

Redis Rpop 命令用于移除并返回列表的最后一个元素。

语法:

redis 127.0.0.1:6379> RPOP KEY_NAME

返回值:列表的最后一个元素。 当列表不存在时,返回 nil 。

可用版本:>= 1.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','banana');
$redis -> lPush('favorite_fruit','apple');
var_dump($redis -> rPop('favorite_fruit'));             // string cherry
var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=2)
//      0 => string 'apple' (length=5)
//      1 => string 'banana' (length=6)

7、BLPOP

Redis Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

(1)当给定多个key参数时,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
   (2)超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限期延长

(3)在MULTI/EXEC事务中的BLPOP,行为表现得就像LPOP一样,对空列表返回nil,对非空列表弹出列表元素,不进行任何阻塞操作。

语法:

redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. LISTN TIMEOUT

返回值:如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

可用版本:>= 2.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

// This first case: 非阻塞行为,最少有一个非空列表
$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','banana');
$redis -> lPush('favorite_fruit','apple');

$redis -> lPush('pats','dog');
$redis -> lPush('pats','cat');
$redis -> lPush('pats','rabbit');

var_dump($redis -> blPop('favorite_fruit',3));
//  array (size=2)
//      0 => string 'favorite_fruit' (length=14)
//      1 => string 'apple' (length=5)

$array_blpop = array('favorite_fruit','pats');
var_dump($redis -> blPop($array_blpop,3));          // 优先弹出第一个非空列表的头元素
//  array (size=2)
//      0 => string 'favorite_fruit' (length=14)
//      1 => string 'banana' (length=6)

var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=1)
//      0 => string 'cherry' (length=6)

// This second case: 阻塞行为, 所有给定key都不存在或包含空列表
var_dump($redis -> blPop('fake_key',2));    // 阻塞链接, 2s 之后超时结束,返回 array (size=0) empty

8、BRPOP

Redis Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

(1)当给定多个key参数时,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。
   (2)超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限期延长

(3)在MULTI/EXEC事务中的BLPOP,行为表现得就像RPOP一样,对空列表返回nil,对非空列表弹出列表元素,不进行任何阻塞操作。

语法:

redis 127.0.0.1:6379> BRPOP LIST1 LIST2 .. LISTN TIMEOUT

返回值:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

可用版本:>= 2.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

// This first case: 非阻塞行为,最少有一个非空列表
$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','banana');
$redis -> lPush('favorite_fruit','apple');

$redis -> lPush('pats','dog');
$redis -> lPush('pats','cat');
$redis -> lPush('pats','rabbit');

var_dump($redis -> brPop('favorite_fruit',3));
//  array (size=2)
//      0 => string 'favorite_fruit' (length=14)
//      1 => string 'cherry' (length=6)

$array_brpop = array('favorite_fruit','pats');
var_dump($redis -> brPop($array_brpop,3));          // 优先弹出第一个非空列表的头元素
//  array (size=2)
//      0 => string 'favorite_fruit' (length=14)
//      1 => string 'banana' (length=6)

var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=1)
//      0 => string 'apple' (length=5)

// This second case: 阻塞行为, 所有给定key都不存在或包含空列表
var_dump($redis -> brPop('fake_key',2));    // 阻塞链接, 2s 之后超时结束,返回 array (size=0) empty

9、LLEN

Redis Llen 命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。

语法:

redis 127.0.0.1:6379> LLEN KEY_NAME

返回值:列表的长度。

可用版本:>= 1.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','banana');
$redis -> lPush('favorite_fruit','apple');

var_dump($redis -> lLen('favorite_fruit'));     // int 3
var_dump($redis -> lLen('fake_key'));           // 列表不存在,返回 int 0

10、LRANGE

Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

  (1)超出范围的下标值不会引起错误。

  (2)如果<tt class="docutils literal" style="margin: 0px; padding: 0px;">start</tt>下标比列表的最大下标<tt class="docutils literal" style="margin: 0px; padding: 0px;">end</tt>(<tt class="docutils literal" style="margin: 0px; padding: 0px;">LLEN list</tt>减去<tt class="docutils literal" style="margin: 0px; padding: 0px;">1</tt>)还要大,或者<tt class="docutils literal" style="margin: 0px; padding: 0px;">start > stop</tt>,LRANGE返回一个空列表。

  (3)如果<tt class="docutils literal" style="margin: 0px; padding: 0px;">stop</tt>下标比<tt class="docutils literal" style="margin: 0px; padding: 0px;">end</tt>下标还要大,Redis将<tt class="docutils literal" style="margin: 0px; padding: 0px;">stop</tt>的值设置为<tt class="docutils literal" style="margin: 0px; padding: 0px;">end</tt>。

语法:

redis 127.0.0.1:6379> **LRANGE **KEY_NAME START END

返回值:一个列表,包含指定区间内的元素。

可用版本:>= 1.0.0

时间复杂度:O(S+N),<tt class="docutils literal" style="margin: 0px; padding: 0px;">S</tt>为偏移量<tt class="docutils literal" style="margin: 0px; padding: 0px;">start</tt>,<tt class="docutils literal" style="margin: 0px; padding: 0px;">N</tt>为指定区间内元素的数量。

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','banana');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','peach');
$redis -> lPush('favorite_fruit','pineapple');
$redis -> lPush('favorite_fruit','grape');

var_dump($redis -> lRange('favorite_fruit',1,3));
//   array (size=3)
//      0 => string 'pineapple' (length=9)
//      1 => string 'peach' (length=5)
//      2 => string 'apple' (length=5)

var_dump($redis -> lRange('favorite_fruit',6,2));     // 当 start > end 时,返回空数组, array (size=0) empty

var_dump($redis -> lRange('favorite_fruit',0,100));   // 当 end 大于列表长度时,按 end 值计算
//  array (size=6)
//      0 => string 'grape' (length=5)
//      1 => string 'pineapple' (length=9)
//      2 => string 'peach' (length=5)
//      3 => string 'apple' (length=5)
//      4 => string 'banana' (length=6)
//      5 => string 'cherry' (length=6)

11、LREM

Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。

COUNT 的值可以是以下几种:

count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
语法:

redis 127.0.0.1:6379> LREM KEY_NAME COUNT VALUE

返回值:被移除元素的数量。 列表不存在时返回 0 。

可用版本:>= 1.0.0

时间复杂度:O(N),N为列表的长度。

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','peach');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','grape');

var_dump($redis -> lRem('favorite_fruit','apple',2));   // int 2    // 从开头向结尾方向移除 2 个
var_dump($redis -> lRange('favorite_fruit',0,-1));
//array (size=4)
//  0 => string 'grape' (length=5)
//  1 => string 'peach' (length=5)
//  2 => string 'apple' (length=5)
//  3 => string 'cherry' (length=6)

var_dump($redis -> lRem('favorite_fruit','apple',-1));   // int1    // 从结尾向开头方向移除 1 个
var_dump($redis -> lRange('favorite_fruit',0,-1));
//array (size=3)
//  0 => string 'grape' (length=5)
//  1 => string 'peach' (length=5)
//  2 => string 'cherry' (length=6)

var_dump($redis -> lRem('favorite_fruit','peach',0));   // int 1    // 移除所有的 value
var_dump($redis -> lRange('favorite_fruit',0,-1));
//array (size=2)
//  0 => string 'grape' (length=5)
//  1 => string 'cherry' (length=6)

12、LSET

Redis Lset 通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。

语法:

redis 127.0.0.1:6379> **LSET **KEY_NAME INDEX VALUE

返回值:操作成功返回 ok ,否则返回错误信息。

可用版本:>= 1.0.0

时间复杂度:对头元素或尾元素进行LSET操作,复杂度为O(1)。其他情况下,为O(N),<tt class="docutils literal" style="margin: 0px; padding: 0px;">N</tt>为列表的长度。

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','peach');
$redis -> lPush('favorite_fruit','grape');

var_dump($redis -> lSet('favorite_fruit','1','pineapple'));   // 将第一个元素替换为 pineapple
var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=4)
//      0 => string 'grape' (length=5)
//      1 => string 'pineapple' (length=9)
//      2 => string 'apple' (length=5)
//      3 => string 'cherry' (length=6)

var_dump($redis -> lSet('favorite_fruit','100','pitaya'));   // boolean false , 对索引超过范围进行设置,设置不成功
var_dump($redis -> lSet('fake_key',1,'mango'));              // boolean false , 对不存在的 key 进行设置,设置不成功

13、LTRIM

Redis Ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。(下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推)。

(1)超出范围的下标值不会引起错误。

(2)如果start下标比列表的最大下标end(LLEN list减去1)还要大,或者start > stop,LTRIM返回一个空列表(因为LTRIM已经将整个列表清空)。

(3)如果stop下标比end下标还要大,Redis将stop的值设置为end。

语法:

redis 127.0.0.1:6379> LTRIM KEY_NAME START STOP

返回值:命令执行成功时,返回 ok

可用版本:>= 1.0.0

时间复杂度:O(N),N为被移除的元素的数量。

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','peach');
$redis -> lPush('favorite_fruit','grape');

var_dump($redis -> lTrim('favorite_fruit',1,-1));
var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=3)
//      0 => string 'peach' (length=5)
//      1 => string 'apple' (length=5)
//      2 => string 'cherry' (length=6)

var_dump($redis -> lTrim('favorite_fruit',1,10));   // end > list 的长度,那就将 stop 值设为 end
var_dump($redis -> lRange('favorite_fruit',0,-1));
//  array (size=2)
//      0 => string 'apple' (length=5)
//      1 => string 'cherry' (length=6)

var_dump($redis -> lTrim('favorite_fruit',7,1));        // start > end 或 start > stop , 清空整个 list
var_dump($redis -> lRange('favorite_fruit',0,-1));     // 返回 array (size=0) empty

14、LINDEX

Redis Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

语法:

redis 127.0.0.1:6379> LINDEX KEY_NAME INDEX_POSITION

返回值:列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内,返回 nil 。

可用版本:>= 1.0.0

时间复杂度:O(N),N为到达下标index过程中经过的元素数量, 对列表的头元素和尾元素执行LINDEX命令,复杂度为O(1)。

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','peach');
$redis -> lPush('favorite_fruit','grape');

var_dump($redis -> lIndex('favorite_fruit',2));     // string 'apple'
var_dump($redis -> lRange('favorite_fruit',0,-1));  // 原 list 表不变
//  array (size=4)
//      0 => string 'grape' (length=5)
//      1 => string 'peach' (length=5)
//      2 => string 'apple' (length=5)
//      3 => string 'cherry' (length=6)

15、LINSERT

Redis Linsert 命令用于在列表的元素前或者后插入元素。 当指定元素不存在于列表中时,不执行任何操作。 当列表不存在时,被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。

语法:

redis 127.0.0.1:6379> LINSERT KEY_NAME BEFORE EXISTING_VALUE NEW_VALUE

返回值:如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。

可用版本:>= 1.0.0

时间复杂度:O(N),N 为寻找pivot过程中经过的元素数量。

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','peach');
$redis -> lPush('favorite_fruit','grape');

// The first case : 成功插入,返回列表长度
var_dump($redis -> lInsert('favorite_fruit','before','apple','Mango'));     // int 5
var_dump($redis -> lRange('favorite_fruit',0,-1));
//array (size=5)
//  0 => string 'grape' (length=5)
//  1 => string 'peach' (length=5)
//  2 => string 'Mango' (length=5)
//  3 => string 'apple' (length=5)
//  4 => string 'cherry' (length=6)

// The seconde case : 没有找到指定元素 ,返回 -1
var_dump($redis -> lInsert('favorite_fruit','before','not_exists','pitaya'));     // int -1
var_dump($redis -> lRange('favorite_fruit',0,-1));      // 原 list 不变
//array (size=5)
//  0 => string 'grape' (length=5)
//  1 => string 'peach' (length=5)
//  2 => string 'Mango' (length=5)
//  3 => string 'apple' (length=5)
//  4 => string 'cherry' (length=6)

// The third case : 没有找到指定元素 ,返回 0
var_dump($redis -> lInsert('fake_key','before','apple','watermelon'));     // int 0

16、RPOPLPUSH

Redis Rpoplpush 命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。

语法:

redis 127.0.0.1:6379> RPOPLPUSH SOURCE_KEY_NAME DESTINATION_KEY_NAME

返回值:被弹出的元素。

可用版本:>= 1.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','peach');
$redis -> lPush('favorite_fruit','grape');

// The first case : 若 source 和 desitination 相同,则尾旋转操作
var_dump($redis -> rpoplpush('favorite_fruit','favorite_fruit'));   // cherry
var_dump($redis -> lRange('favorite_fruit',0,-1));
//array (size=4)
//  0 => string 'cherry' (length=6)
//  1 => string 'grape' (length=5)
//  2 => string 'peach' (length=5)
//  3 => string 'apple' (length=5)

// The second case : 移动操作
var_dump($redis -> rpoplpush('favorite_fruit','other_list'));   // apple
var_dump($redis -> lRange('favorite_fruit',0,-1));
//array (size=3)
//  0 => string 'cherry' (length=6)
//  1 => string 'grape' (length=5)
//  2 => string 'peach' (length=5)

var_dump($redis -> lRange('other_list',0,-1));
//array (size=1)
//  0 => string 'apple' (length=5)

17、BRPOPLPUSH

Redis Brpoplpush 命令从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

(1)当给定列表source不为空时,BRPOPLPUSH的表现和RPOPLPUSH一样。

(2)当列表source为空时,BRPOPLPUSH命令将阻塞连接,直到等待超时,或有另一个客户端对source执行LPUSH或RPUSH命令为止。

(3)超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限期延长

语法:

redis 127.0.0.1:6379> BRPOPLPUSH LIST1 ANOTHER_LIST TIMEOUT

返回值:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。

可用版本:>= 2.0.0

时间复杂度:O(1)

具体实例:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> lPush('favorite_fruit','cherry');
$redis -> lPush('favorite_fruit','apple');
$redis -> lPush('favorite_fruit','peach');
$redis -> lPush('favorite_fruit','grape');

// The first case : 若 source 和 desitination 相同,则尾旋转操作
var_dump($redis -> brpoplpush('favorite_fruit','favorite_fruit',2));   // cherry ,并没有返回 time
var_dump($redis -> lRange('favorite_fruit',0,-1));
//array (size=4)
//  0 => string 'cherry' (length=6)
//  1 => string 'grape' (length=5)
//  2 => string 'peach' (length=5)
//  3 => string 'apple' (length=5)

// The second case : 移动操作
var_dump($redis -> brpoplpush('favorite_fruit','other_list',2));   // apple ,并没有返回 time
var_dump($redis -> lRange('favorite_fruit',0,-1));
//array (size=3)
//  0 => string 'cherry' (length=6)
//  1 => string 'grape' (length=5)
//  2 => string 'peach' (length=5)

var_dump($redis -> lRange('other_list',0,-1));
//array (size=1)
//  0 => string 'apple' (length=5)

var_dump($redis -> brpoplpush('fake_key','desination_key',2));  // 等待 2s 后返回 false  ,并没有返回 time
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Redis::__construct构造函数$redis = new Redis(); connect, open...
    bycall阅读 1,396评论 0 2
  • phpredis是php的一个扩展Redis::__construct构造函数$redis = new Redis...
    hello大象阅读 762评论 0 2
  • 转自:http://bbs.redis.cn/forum.php?mod=viewthread&tid=481 p...
    木十2036阅读 798评论 0 7
  • 昨天用一下午加晚上的时间赶过来看梅,结果今天缺少了赏梅的耐心! 大概是因为疲倦不堪!还有就是失去平静的焦躁的心! ...
    曼谷123阅读 140评论 0 0
  • 我遇到的情绪管理较好的人:梁老师、霍杏花、张程远老师,共同点 1.爱学习,对变化很开放。梁老师是双硕士学位,读过非...
    行者无疆颂阅读 720评论 0 0