一、概述

redis的列表类型可以存储一个有序的字符串列表,内部实现是一个双向链表,允许用户从两端插入元素。所以向两端插入数据的速度是极快的,而且获取数据时也是越接近两端速度越快,一个列表最多能容纳2^32 - 1个元素。

二、命令

2.1 在两端插入元素

  • LPUSH key value [value ...]:在列表的左端插入元素。
  • RPUSH key value [value ...]:在列表的右端插入元素。

返回值表示增加元素后的列表长度。

127.0.0.1:6379> lpush k aaa bbb ccc
(integer) 3
127.0.0.1:6379> rpush k ddd eee fff
(integer) 6

2.2 查询元素

  • LRANGE key start end:获取[start, end]区间的元素。

索引是从0 开始,可用-1表示最后一个元素。

127.0.0.1:6379> lrange k 0 5 # 等价于lange k 0 -1
1) "ccc"
2) "bbb"
3) "aaa"
4) "ddd"
5) "eee"
6) "fff

2.3 弹出元素

  • RPOP key:弹出并返回最右边的元素。
  • LPOP key:弹出并返回最左边的元素。
127.0.0.1:6379> lpop k
"ccc"
127.0.0.1:6379> rpop k
"fff"
127.0.0.1:6379> lrange k 0 -1
1) "bbb"
2) "aaa"
3) "ddd"
4) "eee"

2.4 索引操作

  • LINDEX key offset:获取索引为offset的元素。
  • LSET key index value:设置索引为index的数据为value,索引从0开始。。
  • LINSERT key BEFORE|AFTER pivot value:在pivot前面或者后面插入值。

索引都是从0开始,LINDEX  命令中offset<0 时从右边开始计算索引。

127.0.0.1:6379> lindex k 1
"aaa"
127.0.0.1:6379> lset k 1 maqian  # 设置索引=1的元素值为maqian
OK
127.0.0.1:6379> lindex k 1
"maqian"
127.0.0.1:6379> linsert k before maqian hello  # 在maqian前插入hello
(integer) 5
127.0.0.1:6379> lrange k 0 -1
1) "bbb"
2) "hello"
3) "maqian"
4) "ddd"
5) "eee"

2.5 获取列表长度

  • LLEN key:获取列表的长度。
127.0.0.1:6379> llen k
(integer) 5

2.6 删除元素

  • LREM key count value:删除count个值为value的元素,返回成功删除的元素个数。当count<0时从右边开始删除,当count>0时从左边开始删,当count=0时删除所有的value 。
127.0.0.1:6379> lpush listKey aaa bbb ccc ddd ddd ccc bbb aaa bbb ddd
(integer) 10
127.0.0.1:6379> lrange listKey 0 -1 
 1) "ddd"
 2) "bbb"
 3) "aaa"
 4) "bbb"
 5) "ccc"
 6) "ddd"
 7) "ddd"
 8) "ccc"
 9) "bbb"
10) "aaa"
127.0.0.1:6379> lrem listKey 2 bbb  # 从左边开始删除两个bbb
(integer) 2
127.0.0.1:6379> lrange listKey 0 -1
1) "ddd"
2) "aaa"
3) "ccc"
4) "ddd"
5) "ddd"
6) "ccc"
7) "bbb"
8) "aaa"
127.0.0.1:6379> lrem listKey -2 ddd  # 从右边开始删除两个ddd
(integer) 2
127.0.0.1:6379> lrange listKey 0 -1
1) "ddd"
2) "aaa"
3) "ccc"
4) "ccc"
5) "bbb"
6) "aaa"
127.0.0.1:6379> lrem listKey 0 aaa  # 删除所有的aaa
(integer) 2
127.0.0.1:6379> lrange listKey 0 -1
1) "ddd"
2) "ccc"
3) "ccc"
4) "bbb"

2.7 修剪元素

  •  LTRIM key start end:修剪列表元素,只保留[start, end]区间的元素。
127.0.0.1:6379> ltrim listKey 1 2
OK
127.0.0.1:6379> lrange listKey 0 -1
1) "ccc"
2) "ccc"

2.8 转移元素到另一个列表

  • RPOPLPUSH src dest:从src中弹出最右边的元素并插入到dest的左边,整个过程是原子的。
127.0.0.1:6379> lpush keyA aaa bbb ccc
(integer) 3
127.0.0.1:6379> lpush keyB ddd eee fff
(integer) 3
127.0.0.1:6379> rpoplpush keyA keyB
"aaa"
127.0.0.1:6379> lrange keyA 0 -1
1) "ccc"
2) "bbb"
127.0.0.1:6379> lrange keyB 0 -1
1) "aaa"
2) "fff"
3) "eee"
4) "ddd"

2.9 阻塞式命令

  • BLPOP/BRPOP key [key ...] timeout:从列表key中弹出最左端或者最右端的元素,如果列表中 没有元素,将一直等待timeout时间直到列表中有元素,timeout=0表示不限制超时时间,返回列表名和弹出的元素。
  • BRPOPLPUSH src dest timeouit:从src中弹出元素并存到dest中,会阻塞timeout时间。
    开启两个redis终端,第一个终端阻塞弹出:
127.0.0.1:6379> brpop msgList 0
  # 此时终端会阻塞在这里

第二个终端插入元素:

127.0.0.1:6379> lpush msgList 123 456  # 插入两个元素123 456
(integer) 2

此时第一个终端将会返回数据:

127.0.0.1:6379> brpop msgList 0
1) "msgList"
2) "123"
(87.24s)

再次输入命令brpop msgList 0 ,此时会立马弹出456,因为列表中存在456:

127.0.0.1:6379> brpop msgList 0 
1) "msgList"
2) "456"
最后修改:2017 年 11 月 25 日
如果觉得我的文章对你有用,请随意赞赏