Redis 学习笔记(五)之列表类型

Redis 学习笔记(五)之列表类型

1. 介绍

  • 列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段,因为其内部实现使用双向链表(double linked list)实现的。
  • 与散列类型相同,列表类型最多能容纳2^32 -1 个元素。

2. 列表类型命令

  • LPUSH
    • 将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。
    • 元素是从最左端的到最右端的、一个接一个被插入到 list 的头部。
LPUSH key value [value ...]
127.0.0.1:6379> LPUSH testlist1 a b c
(integer) 3     //返回列表长度
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "c"      //最后插入在头部
2) "b"
3) "a"      //最先插入在最后
  • RPUSH
    • 向存于 key 的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 当 key 保存的不是一个列表,那么会返回一个错误。
    • 元素是从左到右一个接一个从列表尾部插入。
RPUSH key value [value ...]
127.0.0.1:6379> RPUSH testlist1 d e f
(integer) 6
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "c"
2) "b"
3) "a"
4) "d"  
5) "e"
6) "f"      //最后插入在尾部
  • LPUSHX
    • 只有当 key 已经存在并且存着一个 list 的时候,在这个 key 下面的 list 的头部插入 value。 与 LPUSH 相反,当 key 不存在的时候不会进行任何操作。
    • 一次只能插入一个value
LPUSHX key value
127.0.0.1:6379> EXISTS testlist2
(integer) 0     //testlist2不存在
127.0.0.1:6379> LPUSHX testlist2 test
(integer) 0     //添加失败
  • RPUSHX
    • 将值 value 插入到列表 key 的表尾, 当且仅当 key 存在并且是一个列表。 和 RPUSH 命令相反, 当 key 不存在时,RPUSHX 命令什么也不做。
RPUSHX key value
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
6) "f"
7) "g"      //插入成功
  • LPOP
    • 移除并且返回 key 对应的 list 的第一个元素
LPOP key
127.0.0.1:6379> LPOP testlist1
"c"
127.0.0.1:6379> LPOP testlist2
(nil)
  • RPOP
    • 移除并返回存于 key 的 list 的最后一个元素
RPOP key
127.0.0.1:6379> RPOP testlist1
"g"
127.0.0.1:6379> RPOP testlist2
(nil)
  • LLEN
    • 返回存储在 key 里的list的长度。 如果 key 不存在,那么就被看作是空list,并且返回长度为 0。 当存储在 key 里的值不是一个list的话,会返回error。
LLEN key
127.0.0.1:6379> LLEN testlist1
(integer) 4
127.0.0.1:6379> LLEN testlist2
(integer) 0
  • LRANGE
    • 返回存储在 key 的列表里指定范围内的元素。 start 和 end 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头),第二个元素下标是1,以此类推。
    • 偏移量也可以是负数,表示偏移量是从list尾部开始计数。 例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推。
LRANGE key start stop
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "a"
2) "d"
3) "e"
4) "f"
127.0.0.1:6379> LRANGE testlist1 -4 3
1) "a"
2) "d"
3) "e"
4) "f"
//如果start下标比列表的最大小标end大,返回为空列表。
//如果stop比列表长度大,只返回到列表末尾。
  • LREM
    • 从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:
      • count > 0: 从头往尾移除值为 value 的元素。
      • count < 0: 从尾往头移除值为 value 的元素。
      • count = 0: 移除所有值为 value 的元素。
LREM key count value
127.0.0.1:6379> LPUSH testlist1 a b c e b a d e g g e a f 
(integer) 17
127.0.0.1:6379> LLEN testlist1
(integer) 17
127.0.0.1:6379> LRANGE testlist1 0 -1
 1) "f"
 2) "a"
 3) "e"
 4) "g"
 5) "g"
 6) "e"
 7) "d"
 8) "a"
 9) "b"
10) "e"
11) "c"
12) "b"
13) "a"
14) "a"
15) "d"
16) "e"
17) "f"
127.0.0.1:6379> LREM testlist1 3 a
(integer) 3     //从头往尾删除3个a
127.0.0.1:6379> LRANGE testlist1 0 -1
 1) "f"
 2) "e"
 3) "g"
 4) "g"
 5) "e"
 6) "d"
 7) "b"
 8) "e"
 9) "c"
10) "b"
11) "a"
12) "d"
13) "e"
14) "f"
127.0.0.1:6379> LREM testlist1 -3 a
(integer) 1     //从尾到头删除三个a,但只有一个a可以删除
127.0.0.1:6379> LRANGE testlist1 0 -1
 1) "f"
 2) "e"
 3) "g"
 4) "g"
 5) "e"
 6) "d"
 7) "b"
 8) "e"
 9) "c"
10) "b"
11) "d"
12) "e"
13) "f"
127.0.0.1:6379> LREM testlist1 0 e
(integer) 4     //删除所有的e
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "f"
2) "g"
3) "g"
4) "d"
5) "b"
6) "c"
7) "b"
8) "d"
9) "f"
  • LINDEX
    • 返回列表里的元素的索引 index 存储在 key 里面。 下标是从0开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。 负数索引用于指定从列表尾部开始索引的元素。在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。
    • 当 key 位置的值不是一个列表的时候,会返回一个error。
LINDEX key index
127.0.0.1:6379> LINDEX testlist1 0
"f"
127.0.0.1:6379> LRANGE testlist1 0 0
1) "f"
  • LSET
    • 设置 index 位置的list元素的值为 value。
    • 当index超出范围时会返回一个error。
LSET key index value
127.0.0.1:6379> LSET testlist1 0 "test lset"
OK
127.0.0.1:6379> LINDEX testlist1 0
"test lset"
127.0.0.1:6379> LRANGE testlist1 0 0
1) "test lset"
127.0.0.1:6379> LSET testlist2 0 test
(error) ERR no such key     //不存在列表
127.0.0.1:6379> LSET testlist1 100 test
(error) ERR index out of range      /超出下标范围
  • LTRIM
    • 修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素。start 和 stop 都是由0开始计数的, 这里的 0 是列表里的第一个元素(表头),1 是第二个元素,以此类推。
    • start 和 end 也可以用负数来表示与表尾的偏移量,比如 -1 表示列表里的最后一个元素, -2 表示倒数第二个,等等。
LTRIM key start stop
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "test lset"
2) "g"
3) "g"
4) "d"
5) "b"
6) "c"
7) "b"
8) "d"
9) "f"
127.0.0.1:6379> LTRIM testlist1 1 3
OK      //只保留第二个到第四个
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "g"
2) "g"
3) "d"
127.0.0.1:6379> LTRIM testlist1 100 200
OK              //start大于列表最大的下标,列表被清空
127.0.0.1:6379> LRANGE testlist1 0 -1
(empty list or set)
//start大于end,列表也会被清空。
  • LINSERT
    • 把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。
    • 当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。
    • 当 key 存在,但保存的不是一个list的时候,会返回error。
 LINSERT key BEFORE|AFTER pivot value 
127.0.0.1:6379> LINSERT testlist1 BEFORE b before_b
(integer) 6
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "before_b"
2) "b"
3) "c"
4) "a"
5) "b"
6) "a"
127.0.0.1:6379> LINSERT testlist1 AFTER b after_b
(integer) 7
127.0.0.1:6379> LRANGE testlist1 0 -1
1) "before_b"
2) "b"
3) "after_b"
4) "c"
5) "a"
6) "b"
7) "a"
  • RPOPLPUSH
    • 原子性地返回并移除存储在 source 的列表的最后一个元素(列表尾部元素), 并把该元素放入存储在 destination 的列表的第一个元素位置(列表头部)。
    • 如果 source 不存在,那么会返回 nil 值,并且不会执行任何操作。 如果 source 和 destination 是同样的,那么这个操作等同于移除列表最后一个元素并且把该元素放在列表头部, 所以这个命令也可以当作是一个旋转列表的命令。
 RPOPLPUSH source destination 
127.0.0.1:6379> RPOPLPUSH testlist1 testlist2
"a"
127.0.0.1:6379> LRANGE testlist2 0 0
1) "a"
//循环将列表尾部的元素插入到列表头部
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
"b"
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
"a"
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
"c"
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
"b"
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
"b"
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
"a"
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
"c"
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
"b"
127.0.0.1:6379> RPOPLPUSH testlist1 testlist1
  • BLPOP
    • BLPOP 是阻塞式列表的弹出原语。 它是命令 LPOP 的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候, 连接将被 BLPOP 命令阻塞。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
    • 当 BLPOP 被调用时,如果给定 key 内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字 key 一起,组成结果返回给调用者。
    • timeout 参数表示的是一个指定阻塞的最大秒数的整型值。当 timeout 为 0 是表示阻塞时间无限制。
BLPOP key [key ...] timeout
127.0.0.1:6379> BLPOP testlist1 testlist2 0
1) "testlist1"
2) "b"          //弹出第一个非空列表的头元素

127.0.0.1:6379> LTRIM testlist1 9 1
OK
127.0.0.1:6379> LRANGE testlist1 0 -1
(empty list or set)
127.0.0.1:6379> BLPOP testlist1 0


//客户端阻塞等待,打开另一个客户端插入一个元素
127.0.0.1:6379> LPUSH testlist1 test_BLPOP
(integer) 1

//此时被阻塞的客户端返回,弹出了刚才添加的元素,并且耗时了81.14S
127.0.0.1:6379> BLPOP testlist1 0
1) "testlist1"
2) "test_BLPOP"
(81.14s)
127.0.0.1:6379> LRANGE testlist1 0 -1
(empty list or set)         //列表仍然为空
  • BRPOP
    • BRPOP 是一个阻塞的列表弹出原语。 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接。 该命令会按照给出的 key 顺序查看 list,并在找到的第一个非空 list 的尾部弹出一个元素。
BRPOP key [key ...] timeout
127.0.0.1:6379> BRPOP testlist1 testlist2 0
1) "testlist2"      //testlist1为空列表
2) "a"

127.0.0.1:6379> BRPOP testlist1 0
//阻塞,并使用另一个客户端插入元素
127.0.0.1:6379> LPUSH testlist1 test_BRPOP
(integer) 1

127.0.0.1:6379> BRPOP testlist1 0
1) "testlist1"
2) "test_BRPOP"
(35.18s)
//阻塞返回,耗时35.18s
  • BRPOPLPUSH
    • BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本。 当 source 包含元素的时候,这个命令表现得跟 RPOPLPUSH 一模一样。 当 source 是空的时候,Redis将会阻塞这个连接,直到另一个客户端 push 元素进入或者达到 timeout 时限。 timeout 为 0 能用于无限期阻塞客户端。
 BRPOPLPUSH source destination timeout 
127.0.0.1:6379> BRPOPLPUSH testlist1 testlist2 0
//testlist1为空,阻塞等待,使用其他客户端插入元素

127.0.0.1:6379> LPUSH testlist1 BRPOPLPUSH_test1 BRPOPLPUSH_test2       //插入两个元素
(integer) 2

//阻塞返回,并弹出testlist1的尾部元素BRPOPLPUSH_test1到testlist2头部,耗时87.54s
127.0.0.1:6379> BRPOPLPUSH testlist1 testlist2 0
"BRPOPLPUSH_test1"
(87.54s)

//查看testlist2的头部为刚才弹出的元素
127.0.0.1:6379> LRANGE testlist2 0 0
1) "BRPOPLPUSH_test1"
//查看testlist1的头部为剩下的元素
127.0.0.1:6379> LRANGE testlist1 0 0
1) "BRPOPLPUSH_test2"
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值