夯实基础分析探究List列表的点点滴滴
- List列表介绍
- 队列和堆栈场景
- 常用操作指令
- llen获取链表的长度
- llen指令的案例介绍
- 添加购物车信息
- 获取用户数购物车数量
- lindex获取指定位置的元素
- lindex指令的案例介绍
- 获取第三个位置的购物车数据
- lrange获取链表子元素列表
- 下标的选择
- lrange指令的案例介绍
- lset修改指定位置元素
- lset指令的案例介绍
- linsert对链表的某个值之前/之后插入
- 指令说明
- linsert指令的案例介绍
- lrem删除指定值的数据
- lrem指令的案例介绍
- ltrim截取指定值的数据
- 指令介绍
- ltrim指令的案例介绍
- 总结介绍
List列表介绍
Redis的列表(List),其存储结构采用的是双向链表,而非数组形式。这种结构在随机定位方面性能欠佳,但在首尾插入和删除数据方面表现出色。当数据量较大时,需要特别关注链表操作的时间消耗。
队列和堆栈场景
在Redis中,处理列表(List)数据结构时,RPUSH
、RPOP
、LPUSH
和LPOP
这四个命令尤为关键。它们不仅允许用户从列表的右侧或左侧添加和删除元素,还赋予了用户对列表内容进行精细操控的能力。
-
RPUSH: 用于在列表的右端(尾部)添加一个或多个元素。当你希望将新的数据添加到列表的末尾时,可以使用
RPUSH
。- 例如,
RPUSH mylist element1 element2
会将element1
和element2
添加到mylist
的末尾。
- 例如,
-
RPOP: 与
RPUSH
相反,RPOP
命令用于移除并返回列表的右端(尾部)元素。当你想从列表的末尾取出一个元素并处理它时,可以使用RPOP
。- 例如,
RPOP mylist
会移除mylist
的最后一个元素并返回它。
- 例如,
-
LPUSH: 类似于
RPUSH
,但LPUSH
是在列表的左端(头部)添加元素。当你想将新数据插入到列表的开始位置时,LPUSH
是个不错的选择。- 例如,
LPUSH mylist element1 element2
会将element1
和element2
添加到mylist
的开头。
- 例如,
-
LPOP: 与
LPUSH
相反,LPOP
命令用于移除并返回列表的左端(头部)元素。当你需要从列表的开始位置取出一个元素并处理它时,可以使用LPOP
。- 例如,
LPOP mylist
会移除mylist
的第一个元素并返回它。
- 例如,
这四个命令的结合使用,可以构建出许多有用的数据结构操作和数据处理逻辑,如栈(Stack)、队列(Queue)等。
常用操作指令
列表正是采用了双向链表的存储方式。在对其进行操作时,我们需要了解一些关键的概念和操作方法,如下图所示。
接下来我将深入探讨获取链表长度、获取指定位置元素、获取链表子元素、修改指定位置元素、插入元素、删除元素以及定长列表等方面的内容。
注意,介绍说明的内容不代表所有的指令操作,而是作者最喜欢以及常用的指令。
llen获取链表的长度
使用llen命令来获取链表的长度。该命令的时间复杂度为 O(1),可以快速获取链表的长度信息。
llen key
llen指令的案例介绍
如果,使用Redis来存储用户的购物车数据。每个用户都有一个对应的购物车列表,以用户 ID作为键。
添加购物车信息
当用户将商品添加到购物车时,我们使用RPUSH命令将商品信息添加到对应的购物车列表中。
获取用户数购物车数量
现在,我们想要知道【用户ID-1】的购物车中有多少件商品,就可以执行llen 用户ID-1
命令。这样,我们就能准确地获取用户购物车的商品数量,以便进行后续的处理和展示。
lindex获取指定位置的元素
使用lindex命令获取列表中指定位置的元素。该命令的时间复杂度为 O(n),其中 n 为列表的长度。
lindex key index
lindex指令的案例介绍
如果,使用Redis存储用户的订单列表。当需要查询某个用户特定订单在列表中的详细信息时,就可以使用lindex指令。
获取第三个位置的购物车数据
比如,【用户ID-1】有一个购物车列表,要获取该列表中第 3个位置的订单详细信息。
通过执行lindex 用户ID-1 3
,就能获取到指定位置的购物车数据,进而可以对其进行进一步的处理和展示,如查看购物车的商品、价格等具体内容。
lrange获取链表子元素列表
LRANGE
命令用于获取列表中指定区间内的元素。这里的key
是你想要查询的列表的键名。而start end
是指定区间的参数,其中start
是起始位置,end
是结束位置。
lrange key start end
通过指定列表的键(key)以及开始和结束的索引,用户可以轻松地获取一个包含所需子元素的列表。
下标的选择
lrange命令允许用户从Redis的list数据结构中检索一个指定范围的元素。索引是基于0的,其中-1表示列表的最后一个元素,-2表示倒数第二个元素。
0
表示列表的第一个元素(因为 Redis 的列表索引是从 0 开始的)。-2
表示列表的倒数第二个元素(负数索引在 Redis 中用于从列表尾部开始计数,-1
是最后一个元素,-2
是倒数第二个元素,依此类推)。
lrange指令的案例介绍
例如,如果你有一个名为【用户ID-1】的list,并希望获取从索引0(包含)到索引4(包含)的所有元素,你可以使用以下命令:
lrange 用户ID-1 0 3
Redis将返回一个包含指定索引范围内所有元素的列表。如果请求的索引超出了列表的实际范围,那么lrange将只返回实际存在的元素。
lrange key 0 -2
的意思是从列表 key
的第一个元素开始,到倒数第二个元素结束,返回这个区间内的所有元素。
lset修改指定位置元素
使用
lset
命令,它允许你直接通过索引来修改list列表中某个位置的值。
lset key index newValue
其中 key
是list的键名,index
是你想要修改的元素的索引,newValue
是你想要设置的新值。
lset指令的案例介绍
首先,我们初始化一个键(key)为aqueue的列表,这个列表用于存储一系列的元素。接下来,我们向这个列表中添加了两个整数元素,分别是1和2。
这两个元素按照添加的顺序存储在列表中,形成了列表的初始内容。
使用 lset 命令来根据索引直接修改list中某个元素的值。通过指定list的键名、索引位置和新值。
lset aqueue 1 b
可以看出来对应的第一个index坐标的值改为了b,如下图所示。
linsert对链表的某个值之前/之后插入
linsert
命令通过引入before
和after
机制,提供了一种基于已存在元素值来插入新元素的灵活方式。
指令说明
linsert
命令接收四个参数:列表的键名、位置指示(BEFORE
或 AFTER
)、参考元素值以及要插入的新元素值。
linsert key before 元素值插入的对象值
linsert
命令能够在不改变列表中其他元素位置的情况下,将新元素精准地插入到指定位置。
linsert指令的案例介绍
当我们考虑Redis中的aqueue
队列时,为了增强其功能或满足特定需求,我们可以选择在队列中已有的a
元素之前插入一个新的元素w
。
当我们考虑Redis中的aqueue
队列时,为了增强其功能或满足特定需求,我们可以选择在队列中已有的w
元素之后插入一个新的元素x
。
lrem删除指定值的数据
当需要移除列表中与特定值的所有元素时,我们可以利用Redis的LREM命令,并将count参数设置为0,从而实现对列表的精确控制和管理。
在Redis中,我们可以根据给定的参数value
和count
的值来移除列表中与value
相等的元素。
LREM key count value
LREM
命令接受三个参数:列表的键名、要移除的元素的数量(count
)以及要移除的元素的值(value
)。当count
为0时,LREM
命令将移除列表中所有与指定值相等的元素。
lrem指令的案例介绍
在处理aqueue
队列时,我们采用LREM
命令来移除所有值为w
的元素,其中参数0
表示执行全局搜索并删除所有匹配的元素。
ltrim截取指定值的数据
ltrim为了优化列表的内容,我们可以对列表进行裁剪,仅保留指定区间内的元素,以精简和聚焦列表的内容。
指令介绍
LTRIM
是 Redis 中的一个命令,用于对列表(List)进行修剪,即移除列表中指定范围之外的元素,只保留指定范围内的元素。
ltrim key start stop
这里的 key
是你想要操作的列表的键名,而 start
和 stop
则是你想要保留的元素的索引范围。
ltrim指令的案例介绍
ltrim
命令会移除列表中所有不在 [0, 1]
范围内的元素,只保留范围内的元素。
这个命令对于限制列表的大小或者只保留列表中的一部分元素非常有用。
总结介绍
Redis提供了丰富的列表(List)数据结构操作指令,这些指令允许用户灵活地管理存储在Redis中的列表数据。
这些指令为Redis列表数据结构提供了强大的操作能力,使用户能够轻松地实现队列、堆栈等数据结构,并灵活地管理列表数据。