Redis04-列表

196 阅读4分钟

redis的列表

定义:

用来存储多个有序的字符串,列表中的每个字符串称为元素(element)。Redis中,可以对列表两端进行插入(push)和弹出(pop),还可以获取指定范围元素列表(lrange),获取指定索引下标的元素(lindex)。列表还是一种比较灵活的数据结构,可以充当栈和队列的角色。

列表类型有两个特点:一、列表中的元素是有序的。二、列表中的元素是可以重复的。

命令:

1.添加操作

(1)从右边插入元素
127.0.0.1:6379> rpush listkey a b c d e
(integer) 5

取出列表中的所有元素

127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
(2)从左边插入元素
127.0.0.1:6379> lpush listkey02 a b c d e
(integer) 5

取出列表中的所有元素

127.0.0.1:6379> lrange listkey02 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
(3)向某个元素前或者后插入元素
127.0.0.1:6379> linsert listkey before b gg
(integer) 6
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "gg"
3) "b"
4) "c"
5) "d"
6) "e"

2.查找

(1)获取指定范围内的元素列表
127.0.0.1:6379> lrange listkey 0 3
1) "a"
2) "gg"
3) "b"
4) "c"
(2)获取列表中指定下标的元素
127.0.0.1:6379> lindex listkey 3
"c"
(3)获取列表的长度
127.0.0.1:6379> llen listkey
(integer) 6

3.删除

(1)从左侧弹出元素
127.0.0.1:6379> lpop listkey
"a"
(2)从右侧弹出元素
127.0.0.1:6379> rpop listkey
"e"
(3)删除指定元素
127.0.0.1:6379> lrem listkey 2 b
(integer) 1
127.0.0.1:6379> lrange listkey 0 -1
1) "gg"
2) "c"
3) "d"
(4)根据索引范围修建列表(只会保留区间内的元素,区间外的元素会被删除)
127.0.0.1:6379> ltrim listkey 1 2
OK
127.0.0.1:6379> lrange listkey 0 -1
1) "c"
2) "d"

4.修改

(1)修改指定索引下标的元素
127.0.0.1:6379> lrange listkey 0 -1
1) "gg"
2) "c"
3) "d"
127.0.0.1:6379> lset listkey 0 a
OK
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "c"
3) "d"

5.阻塞操作

阻塞式弹出:blpop和brpop分别是lpop和rpop的阻塞版本,除了弹出方向不一样之外,使用方法都相同。下面以brpop为主。brpop包含两个参数:key(键)和timeout(阻塞时间)。

(1)列表为空

timeout=3时,客户端需要等到3秒后返回,如果timeout为0,则阻塞。

127.0.0.1:6379> brpop list:test 3
(nil)
(3.04s)
127.0.0.1:6379> brpop list:test 0
--  阻塞 --

如果此时给客户端添加了数据,客户端会立刻返回添加的数据。

127.0.0.1:6379> brpop list:test 0
1) "list:test"
2) "dd"
(102.72s)
(2)列表不为空
127.0.0.1:6379> brpop list:test 0
1) "list:test"
2) "dd"
(102.72s)
(3)使用brpop时,需要注意两点

第一点,如果rpush添加了多个key,那么brpop会从左到右进行遍历,一旦有一个键弹出一个元素,在客户端显示。

127.0.0.1:6379> brpop list:1 list:2 list:3 0
--  阻塞 --

此时,另个一客户端向list:2和list:3添加元素。

127.0.0.1:6379> lpush list:2 gg
(integer) 1
127.0.0.1:6379> lpush list:3 kk
(integer) 1

客户端会立刻返回list:2中的数据,因为list:2是最先添加的元素。

127.0.0.1:6379> brpop list:1 list:2 list:3 0
1) "list:2"
2) "gg"
(96.39s)

第二点,如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端会获取到弹出的值。

内部编码:

.ziplist(压缩列表)

元素个数小于512个(默认)时,同时列表中每个元素的值都小于64字节(默认),Redis会选择ziplist作为列表内部实现来减少内存的使用。

.linkedlist(链表)

列表类型无法满足ziplist的条件时,redis会使用linkedlist作为列表的内部实现。

redis在之后的版本中,提供了quicklist内部编码,简单来说它是一个ziplist为节点的linkedlist,结合了ziplist和linkedlist两者的优势,为列表提供了一个种更优秀的内部编码实现。

127.0.0.1:6379> rpush listkey aa bb cc dd
(integer) 4
127.0.0.1:6379> object encoding listkey
"quicklist"