作者推荐 |【Redis技术进阶之路】「技术提升系列」夯实基础分析探究List列表的点点滴滴

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!


List列表介绍

Redis的列表(List),其存储结构采用的是双向链表,而非数组形式。这种结构在随机定位方面性能欠佳,但在首尾插入和删除数据方面表现出色。当数据量较大时,需要特别关注链表操作的时间消耗。

队列和堆栈场景

在Redis中,处理列表(List)数据结构时,RPUSHRPOPLPUSHLPOP这四个命令尤为关键。它们不仅允许用户从列表的右侧或左侧添加和删除元素,还赋予了用户对列表内容进行精细操控的能 力。

  • RPUSH : 用于在列表的右端(尾部)添加一个或多个元素。当你希望将新的数据添加到列表的末尾时,可以使用RPUSH

    • 例如,RPUSH mylist element1 element2 会将element1element2添加到mylist的末尾。
  • RPOP : 与RPUSH相反,RPOP命令用于移除并返回列表的右端(尾部)元素。当你想从列表的末尾取出一个元素并处理它时,可以使用RPOP

    • 例如,RPOP mylist会移除mylist的最后一个元素并返回它。
  • LPUSH : 类似于RPUSH,但LPUSH是在列表的左端(头部)添加元素。当你想将新数据插入到列表的开始位置时,LPUSH是个不错的选择。

    • 例如,LPUSH mylist element1 element2会将element1element2添加到mylist的开头。
  • LPOP : 与LPUSH相反,LPOP命令用于移除并返回列表的左端(头部)元素。当你需要从列表的开始位置取出一个元素并处理它时,可以使用LPOP

    • 例如,LPOP mylist会移除mylist的第一个元素并返回它。

这四个命令的结合使用,可以构建出许多有用的数据结构操作和数据处理逻辑,如栈(Stack)、队列(Queue)等。

常用操作指令

列表正是采用了双向链表的存储方式。在对其进行操作时,我们需要了解一些关键的概念和操作方法,如下图所示。

接下来我将深入探讨获取链表长度、获取指定位置元素、获取链表子元素、修改指定位置元素、插入元素、删除元素以及定长列表等方面的内容。

注意,介绍说明的内容不代表所有的指令操作,而是作者最喜欢以及常用的指令

llen获取链表的长度

使用llen命令来获取链表的长度。该命令的时间复杂度为 O(1),可以快速获取链表的长度信息

bash 复制代码
llen key

llen指令的案例介绍

若采用Redis来存储用户的购物车信息,我们为每个用户分配一个独特的购物车列表,并以其用户ID作为标识这些列表的键。

添加购物车信息

当用户将商品添加到购物车时,我们使用RPUSH命令将商品信息添加到对应的购物车列表中。

获取用户数购物车数量

现在,我们想要知道【用户ID-1 】的购物车中有多少件商品,就可以执行llen 用户ID-1命令。这样,我们就能准确地获取用户购物车的商品数量,以便进行后续的处理和展示。

lindex获取指定位置的元素

使用lindex命令获取列表中指定位置的元素。该命令的时间复杂度为 O(n),其中 n 为列表的长度

bash 复制代码
lindex key index

lindex指令的案例介绍

如果,使用Redis存储用户的订单列表。当需要查询某个用户特定订单在列表中的详细信息时,就可以使用lindex指令。

获取第三个位置的购物车数据

举例来说,如果我们要查询【用户ID-1】的购物车列表中第三个位置的订单详情,我们该如何操作呢?

通过执行lindex 用户ID-1 3,就能获取到指定位置的购物车数据,进而可以对其进行进一步的处理和展示,如查看购物车的商品、价格等具体内容。

lrange获取链表子元素列表

LRANGE 命令用于获取列表中指定区间内的元素。这里的 key 是你想要查询的列表的键名。而 start end 是指定区间的参数,其中 start 是起始位置,end 是结束位置。

bash 复制代码
lrange key start end

通过指定列表的键(key)以及开始和结束的索引,用户可以轻松地获取一个包含所需子元素的列表。

下标的选择

lrange命令允许用户从Redis的list数据结构中检索一个指定范围的元素。索引是基于0的,其中-1表示列表的最后一个元素,-2表示倒数第二个元素。

  • 0 表示列表的第一个元素(因为 Redis 的列表索引是从 0 开始的)。
  • -2 表示列表的倒数第二个元素(负数索引在 Redis 中用于从列表尾部开始计数,-1 是最后一个元素,-2 是倒数第二个元素,依此类推)。

lrange指令的案例介绍

例如,如果你有一个名为【用户ID-1】的list,并希望获取从索引0(包含)到索引4(包含)的所有元素,你可以使用以下命令:

bash 复制代码
lrange 用户ID-1 0 3

Redis将返回一个包含指定索引范围内所有元素的列表。如果请求的索引超出了列表的实际范围,那么lrange将只返回实际存在的元素。

lrange key 0 -2 的意思是从列表 key 的第一个元素开始,到倒数第二个元素结束,返回这个区间内的所有元素。

lset修改指定位置元素

使用 lset 命令,它允许你直接通过索引来修改list列表中某个位置的值。

bash 复制代码
lset key index newValue

其中 key 是list的键名,index 是你想要修改的元素的索引,newValue 是你想要设置的新值。

lset指令的案例介绍

首先,我们初始化一个键(key)为aqueue的列表,这个列表用于存储一系列的元素。接下来,我们向这个列表中添加了两个整数元素,分别是1和2。

List列表的初始内容是由这两个元素按照它们被添加进列表的顺序排列而成的。

我们可以利用lset命令直接对列表中的特定元素进行修改,方法是通过指定列表的键名、元素的索引位置以及新的值。

bash 复制代码
lset aqueue 1 b

可以看出来对应的第一个index坐标的值改为了b,如下图所示。

linsert对链表的某个值之前/之后插入

linsert 命令通过引入 beforeafter 机制,提供了一种基于已存在元素值来插入新元素的灵活方式

指令说明

linsert 命令接收四个参数:列表的键名、位置指示(BEFOREAFTER)、参考元素值以及要插入的新元素值。

bash 复制代码
linsert  key before  元素值插入的对象值

linsert 命令能够在不改变列表中其他元素位置的情况下,将新元素精准地插入到指定位置。

linsert指令的案例介绍

当我们考虑Redis中的aqueue队列时,为了增强其功能或满足特定需求,我们可以选择在队列中已有的a元素之前插入一个新的元素w

当我们考虑Redis中的aqueue队列时,为了增强其功能或满足特定需求,我们可以选择在队列中已有的w元素之后插入一个新的元素x

lrem删除指定值的数据

当需要移除列表中与特定值的所有元素时,我们可以利用Redis的LREM命令,并将count参数设置为0,从而实现对列表的精确控制和管理。

在Redis中,我们可以根据给定的参数valuecount的值来移除列表中与value相等的元素。

bash 复制代码
LREM key count value

LREM命令接受三个参数:列表的键名、要移除的元素的数量(count)以及要移除的元素的值(value)。当count为0时,LREM命令将移除列表中所有与指定值相等的元素。

lrem指令的案例介绍

在管理aqueue队列时,为了移除所有值为w的元素,我们运用了LREM命令,并通过设置参数0来确保进行全局搜索并彻底删除所有匹配的项。

ltrim截取指定值的数据

为了精简和集中列表的内容,我们可以利用ltrim命令对列表进行精确的裁剪,确保列表中仅包含所需区间内的元素,从而优化列表的呈现和管理。

指令介绍

LTRIM 是 Redis 中的一个命令,用于对列表(List)进行修剪,即移除列表中指定范围之外的元素,只保留指定范围内的元素。

bash 复制代码
ltrim key start stop

这里的 key 是你想要操作的列表的键名,而 startstop 则是你想要保留的元素的索引范围。

ltrim指令的案例介绍

ltrim 命令会移除列表中所有不在 [0, 1] 范围内的元素,只保留范围内的元素。

这个命令在需要控制列表大小或筛选保留列表特定部分元素时,展现出了其极高的实用性和效率。

总结介绍

Redis提供了丰富的列表(List)数据结构操作指令,这些指令允许用户灵活地管理存储在Redis中的列表数据。

队列和堆栈指令

  • RPUSH: 将一个或多个值插入到列表的右侧(尾部)。这常用于实现队列操作,其中数据从一端(尾部)入队。
  • LPUSH: 将一个或多个值插入到列表的左侧(头部)。这在需要实现堆栈或需要数据从一端(头部)入栈的场景中非常有用。
  • RPOP: 移除并返回列表的右侧(尾部)元素。在队列场景中,这通常用于出队操作。
  • LPOP: 移除并返回列表的左侧(头部)元素。在堆栈场景中,这用于执行出栈操作。

常用操作指令

  • llen: 获取列表的长度。这对于需要知道列表当前存储了多少个元素的场景非常有用。
  • lindex: 获取列表中指定索引位置的元素。索引是基于0的,因此第一个元素的索引是0。
  • lrange: 获取列表中指定范围的元素。这允许用户检索列表的某个子集,例如,只获取列表的前几个元素或某个范围内的元素。
  • lset: 修改列表中指定索引位置的元素。如果索引位置不存在,操作将失败。
  • linsert: 在列表的某个值之前或之后插入新元素。这为用户提供了在列表中特定位置插入新元素的灵活性。
  • lrem: 根据指定的值从列表中移除元素。用户可以指定要移除的值的数量(例如,移除所有与给定值匹配的元素,或只移除匹配值的第一次或最后一次出现)。
  • ltrim: 修剪列表,只保留指定范围内的元素。这允许用户根据索引范围来裁剪列表,从而删除不需要的元素。

Redis列表数据结构提供了强大的操作能力,使用户能够轻松地实现队列、堆栈等数据结构,并灵活地管理列表数据。

相关推荐
camellias_5 分钟前
SpringBoot(二十三)SpringBoot集成JWT
java·spring boot·后端
tebukaopu1487 分钟前
springboot如何获取控制层get和Post入参
java·spring boot·后端
昔我往昔7 分钟前
SpringBoot 创建对象常见的几种方式
java·spring boot·后端
灭掉c与java13 分钟前
第三章springboot数据访问
java·spring boot·后端
啊松同学42 分钟前
【Java】设计模式——工厂模式
java·后端·设计模式
枫叶_v1 小时前
【SpringBoot】20 同步调用、异步调用、异步回调
java·spring boot·后端
未知陨落1 小时前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树
Allen Bright2 小时前
Redis介绍
数据库·redis·缓存
源码12153 小时前
ASP.NET MVC宠物商城系统
后端·asp.net·宠物
CyberMuse3 小时前
表的数据结构和常见操作
数据结构