Redis数据结构之List

发布于:2025-04-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

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 -1
 1) "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 -1
 1) "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"


网站公告

今日签到

点亮在社区的每一天
去签到