Redis数据结构之List
目录
- 1.概述
- 2.常见操作
- 2.1 LPUSH/RPUSH/LRANGE
- 2.2 LPOP/RPOP
- 2.3 LINDEX
- 2.4 LLEN
- 2.5 LREM
- 2.6 LTRIM
- 2.7 RPOPLPUSH
- 2.8 LSET
- 2.9 LINSERT
1.概述
- List是简单的字符串列表,单key多个value,按照插入顺序排序。
-
支持添加一个元素到列表的头部(左边)或者尾部(右边)。
-
它的底层实际是个双端链表,主要功能有push/pop等,用在栈,队列,消息队列等场景,left/right都可以插入添加,如果键不存在创建新的链表,键已存在,则新增内容,如果值全被移除了,对应的键也就消失了。
双端链表两端操作的效率很高,通过索引下标的操作性能略有下降
-
最多可以包含2³²-1个元素 (4294967295, 每个列表超过40亿个元素)。
2.常见操作
2.1 LPUSH/RPUSH/LRANGE
LPUSH将一个或多个值插入头部(左边),RPUSH是将一个或多个值插入尾部(右边)
案例:
127.0.0.1:6379> lpush list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> rpush list2 1 2 3 4 5
(integer) 5
LRANGE从头部开始遍历,获取元素,下标从0开始,0到-1是全部遍历
案例:
127.0.0.1:6379> LRANGE list1 0 3
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> LRANGE list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> LRANGE list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
不存在RRANGE命令
2.2 LPOP/RPOP
LPOP,从左侧弹出(移除)元素,RPOP从右侧弹出元素,被弹出的元素会被返回。
127.0.0.1:6379> lrange list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop list1
"5"
127.0.0.1:6379> lpop list1
"4"
127.0.0.1:6379> lpop list1
"3"
127.0.0.1:6379> lpop list1
"2"
127.0.0.1:6379> lpop list1
"1"
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> rpop list2
"5"
127.0.0.1:6379> rpop list2
"4"
127.0.0.1:6379> rpop list2
"3"
127.0.0.1:6379> rpop list2
"2"
127.0.0.1:6379> rpop list2
"1"
2.3 LINDEX
根据下标获取元素
127.0.0.1:6379> rpush list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lindex list1 0
"1"
127.0.0.1:6379> lindex list1 2
"3"
2.4 LLEN
元素个数,list.size();
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> llen list1
(integer) 5
2.5 LREM
删除num个值是value的元素
lrem key num value
例:
127.0.0.1:6379> lpush list3 1 2 3 4 5 5 5 5 5 6 7 8
(integer) 12
127.0.0.1:6379> lrange list3 0 -11) "8"2) "7"3) "6"4) "5"5) "5"6) "5"7) "5"8) "5"9) "4"
10) "3"
11) "2"
12) "1"
127.0.0.1:6379> lrem list3 2 5
(integer) 2
127.0.0.1:6379> lrange list3 0 -11) "8"2) "7"3) "6"4) "5"5) "5"6) "5"7) "4"8) "3"9) "2"
10) "1"
2.6 LTRIM
截取指定范围的值后再赋给key
LTRIM key start end
例:
127.0.0.1:6379> rpush list1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> LTRIM list1 3 5
OK
127.0.0.1:6379> lrange list1 0 -1
1) "4"
2) "5"
3) "6"
2.7 RPOPLPUSH
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPOPLPUSH key source target
例:
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lrange list2 0 -1
1) "5"
2) "6"
3) "7"
4) "8"
127.0.0.1:6379> rpoplpush list1 list2
"4"
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"
2.8 LSET
设置某个下标的值
LSET key index value
例:
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"
127.0.0.1:6379> lset list2 3 abc
OK
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "abc"
5) "8"
2.9 LINSERT
在某个已有值existValue前或后加个新的值newValue
LINSERT key before|after existValue newValue
例:
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "abc"
5) "8"
127.0.0.1:6379> LINSERT list2 before abc def
(integer) 6
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "def"
5) "abc"
6) "8"