Redis实用指令(三)——List

来源:互联网 发布:大数据时代 txt 久久 编辑:程序博客网 时间:2024/06/06 12:40

Lpush:命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
Lpushx:将一个或多个值插入到已存在的列表头部,列表不存在时操作无效。
注意比较这两个在指令的异同:
相同点:1、都是把值放入列表的头部(索引是0);2、都可以同时插入多个值;3、当key的类型不匹配时都会返回错误;4、返回结果都是操作后列表的长度。
不同点:当操作的key不存在时,lpush会创建一个,lpushx返回0,不会创建列表。

redis 127.0.0.1:6379> LPUSH list1 "foo"(integer) 1redis 127.0.0.1:6379> LPUSHX list1 "bar"(integer) 2redis 127.0.0.1:6379> LPUSHX list2 "bar"(integer) 0redis 127.0.0.1:6379> LRANGE list1 0 -11) "foo"2) "bar"

Lset :通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。
这里说的是通过索引来设置元素的值,我觉得用修改来说更贴切些,因为这里的lset不会创建,只是用来对现有的值进行修改。

127.0.0.1:6379> lrange mylist 0 -11) "kun"2) "pang"127.0.0.1:6379> lset mylist 2 aa(error) ERR index out of range127.0.0.1:6379> lset mylist 1 aaOK127.0.0.1:6379> lrange mylist 0 -11) "kun"2) "aa"127.0.0.1:6379> 

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

127.0.0.1:6379> lindex mylist 2(nil)127.0.0.1:6379> lindex mylist 1"aa"127.0.0.1:6379> 

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

127.0.0.1:6379> linsert mylist before kun pang(integer) 3127.0.0.1:6379> linsert mylist after kun k2(integer) 4127.0.0.1:6379> linsert mylist after kun1 k2(integer) -1127.0.0.1:6379> lrange mylist 0 -11) "pang"2) "kun"3) "k2"4) "aa"127.0.0.1:6379> 

在指令中用before就是在指定元素之前插入,如果用after就是在之后插入。
有一点这里没有说明,如果一个列表中存在两个一样的值,插入的时候以哪个值为标准,这里我测试了下:

127.0.0.1:6379> lpush mylist k2(integer) 5127.0.0.1:6379> lrange mylist 0 -11) "k2"2) "pang"3) "kun"4) "k2"5) "aa"127.0.0.1:6379> linsert mylist after k2 af(integer) 6127.0.0.1:6379> lrange mylist 0 -11) "k2"2) "af"3) "pang"4) "kun"5) "k2"6) "aa"127.0.0.1:6379> linsert mylist after k2 af(integer) 7127.0.0.1:6379> lrange mylist 0 -11) "k2"2) "af"3) "af"4) "pang"5) "kun"6) "k2"7) "aa"127.0.0.1:6379> linsert mylist before k2 af(integer) 8127.0.0.1:6379> lrange mylist 0 -11) "af"2) "k2"3) "af"4) "af"5) "pang"6) "kun"7) "k2"8) "aa"127.0.0.1:6379> 

这里的结果显示,如果有两个一样的值,会以第一个值为标准来执行,多个的时候也一样,大家可以试下。

Llen :返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。
Lpop :移除并返回列表的第一个元素。
Lrange :返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。(这个指令上边一直在用)

Lrem :根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:

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

这里比较麻烦些,具体的还是通过实际操作来理解比较好。

127.0.0.1:6379> lrange mylist 0 -11) "b"2) "k2"3) "pang"4) "k2"5) "k2"6) "kun"7) "k2"8) "aa"127.0.0.1:6379> lrem mylist 1 af(integer) 0127.0.0.1:6379> lrem mylist 1 k2(integer) 1127.0.0.1:6379> lrange mylist 0 -11) "b"2) "pang"3) "k2"4) "k2"5) "kun"6) "k2"7) "aa"127.0.0.1:6379> lpush mylist k2 k2 k2 k2(integer) 11127.0.0.1:6379> lrange mylist 0 -1 1) "k2" 2) "k2" 3) "k2" 4) "k2" 5) "b" 6) "pang" 7) "k2" 8) "k2" 9) "kun"10) "k2"11) "aa"127.0.0.1:6379> lrem mylist  3 k2(integer) 3127.0.0.1:6379> lrange mylist 0 -11) "k2"2) "b"3) "pang"4) "k2"5) "k2"6) "kun"7) "k2"8) "aa"127.0.0.1:6379>

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

127.0.0.1:6379> lrange mylist 0 -11) "k2"2) "b"3) "pang"4) "k2"5) "k2"6) "kun"7) "k2"8) "aa"127.0.0.1:6379> ltrim mylist 2 -1OK127.0.0.1:6379> lrange mylist 0 -11) "pang"2) "k2"3) "k2"4) "kun"5) "k2"6) "aa"127.0.0.1:6379> 

Blpop :移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

127.0.0.1:6379> lrange mylist 0 -11) "pang"2) "k2"3) "k2"4) "kun"5) "k2"6) "aa"127.0.0.1:6379> blpop myl 10(nil)(10.01s)(没有找到要移除的值,实际等待了10.01秒)127.0.0.1:6379> blpop mylist 51) "mylist"(列表名:key)2) "pang"(被移除的value127.0.0.1:6379> lrange mylist 0 -11) "k2"2) "k2"3) "kun"4) "k2"5) "aa"127.0.0.1:6379> 

Brpop:移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
值得注意的是,Blpop 和Brpop都可以同时对多个list进行操作,首先被移除的是第一个列表的值,当第一个列表为空的时候才会对后边列表一次操作。

(本例是blpop )127.0.0.1:6379> lpush list1 value1 valuea valueb(integer) 3127.0.0.1:6379> lpush list2 value2 valuea valueb(integer) 3127.0.0.1:6379> blpop list1 list2 value1 51) "list1"2) "valueb"127.0.0.1:6379> blpop list1 list2 valuea 51) "list1"2) "valuea"127.0.0.1:6379> lrange list2 0 -11) "valueb"2) "valuea"3) "value2"127.0.0.1:6379> blpop list1 list2 value1 51) "list1"2) "value1"127.0.0.1:6379> lrange list1 0 -1(empty list or set)127.0.0.1:6379> lrange list2 0 -11) "valueb"2) "valuea"3) "value2"127.0.0.1:6379> blpop list1 list2 value1 51) "list2"2) "valueb"127.0.0.1:6379> 

Brpoplpush :从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
第一个列表中的值会被移除,且操作的是最后一个。

127.0.0.1:6379> lrange list1 0 -11) "valueb"2) "valuea"127.0.0.1:6379> lrange list2 0 -11) "valuea"2) "value2"127.0.0.1:6379> brpoplpush list1 list2 5"valuea"127.0.0.1:6379> lrange list1 0 -11) "valueb"

Rpop :移除并返回列表的最后一个元素。
Rpoplpush :移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
Rpush :将一个或多个值插入到列表的尾部(最右边)。
如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。
Rpushx:将一个或多个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效。

Rpush 、Rpushx、Lpush 和Lpushx这四个指令可以对比着查看理解。

Redis中文网指令:http://www.redis.net.cn/order/3584.html

0 0