当前位置: 首页 > news >正文

【redis初阶】------List 列表类型

List 列表类型

列表类型是用来存储多个有序的字符串,如图1所示,a、b、c、d、e 五个元素从左到右组成了一

个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储 2^32 - 1 个元

素。在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等(如图所示)。列表是一种比较灵活的数据结构,它可以

充当栈和队列的角色,在实际开发上有很多应用场景。

列表类型的特点:

1. 列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,例如要获取图的第 5 个元素,可以执行 lindex user:1:messages 4 或者倒数第 1 个元素,lindex

user:1:messages -1 就可以得到元素 e。

2. 区分获取和删除的区别,例如图中的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删

除,这个操作会导致列表的长度从 5 变成 4;但是执行 lindex 4 只会获取元素,但列表长度是不会变化的。

3. 列表中的元素是允许重复的,例如图 2-21 中的列表中是包含了两个 a 元素的。

基本命令

LPUSH

将一个或者多个元素从左侧放入(头插)到 list 中。

语法:

LPUSH key element [element ...]

返回值:插入后 list 的长度。

示例:

LPUSHX

在 key 存在时,将一个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回

语法:

LPUSHX key element [element ...]

返回值:插入后 list 的长度。

示例:

RPUSH

将一个或者多个元素从右侧放入(尾插)到 list 中。

语法:

RPUSH key element [element ...]

返回值:插入后 list 的长度。

示例:

RPUSHX

在 key 存在时,将一个或者多个元素从右侧放入(尾插)到 list 中。

语法:

RPUSHX key element [element ...]

返回值:插入后 list 的长度。

示例:

LRANGE

获取从 start 到 end 区间的所有元素,左闭右闭。

语法:

LRANGE key start stop

返回值:指定区间的元素。

示例:

 LPOP

从 list 左侧取出元素(即头删)。

语法:

LPOP key

返回值:取出的元素或者 nil。

示例:

RPOP

从 list 右侧取出元素(即尾删)。

语法:

RPOP key

返回值:取出的元素或者 nil。

示例:

LREM

删除列表中对应的元素。

语法:

LREM key count element# count 代表想要删除元素的个数count > 0:移除等于从头移动到尾的元素。count < 0:移除从尾部移动到头部的元素。count = 0:删除所有等于element的元素。# element 代表要删除的值

LTRIM

获取指定区间的值,并将区间外的值删除。

语法:

LTRIM key start stop

示例:

LSET

根据指定下标,修改元素。

语法:

LSET key index element

示例:

 LINDEX

获取从左数第 index 位置的元素。

语法:

LINDEX key index

返回值:取出的元素或者 nil。

示例:

 LINSERT

在特定位置插入元素。

语法:

LINSERT key <BEFORE | AFTER> pivot element

返回值:插入后的 list 长度。

示例:

 LLEN

获取 list 长度。

语法:

LLEN key

返回值:list 的长度。

示例:

阻塞版本的理解

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本一致,除了

1. 在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但如果列表中没有元素,非阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞一段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态

2. 命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表中可以弹出素,命令立即返回。

3. 如果多个客户端同时对一个键执行 pop,则最先执行命令的客户端会得到弹出的元素。

BLPOP

LPOP 的阻塞版本。

语法:

BLPOP key [key ...] timeout

返回值:取出的元素或者 nil。

示例:

BRPOP

RPOP 的阻塞版本。

语法:

BRPOP key [key ...] timeout

返回值:取出的元素或者 nil。

示例:

阻塞等待列表,只要有一个列表存在数据就直接返回,不查看其他列表有没有数据;

内部编码

列表类型的内部编码有两种:

• ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的长度都小于 list-max-ziplist-value 配置(默认 64字节)时,Redis 会选用ziplist 来作为列表的内部编码实现来减少内存消耗。

• linkedlist(链表):当列表类型无法满足 ziplist 的条件时,Redis 会使用 linkedlist 作为列表的内部实现。

1)当元素个数较少且没有大元素时,内部编码为 ziplist:

2)当元素个数超过 512 时,内部编码为 linkedlist:

3)当某个元素的长度超过 64字节时,内部编码为 linkedlist:

quicklist 相当于是 链表 和 压缩列表 的结合整体还是一个链表,链表的每个节点,是一个压缩列表,每个压缩列表,都不让它太大,同时再把多个压缩列表通过链式结构连起来;

使用场景

消息队列

如图所示,Redis 可以使用 lpush + brpop 命令组合实现经典的阻塞式生产者-消费者模型队

列,生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式 地从队列中 "争抢" 队首元素。通过多个客户端来保证消费的负载均衡和高可用性。

 分频道的消息队列

如图所示,Redis 同样使用 lpush + brpop 命令,但通过不同的键模拟频道的概念,不同的消费

者可以通过 brpop 不同的键值,实现订阅不同频道的理念。

多个列表 / 频道 这种场景非常常见的,日常使用的一些程序:抖音。有一个通道,来传输短视频数

据,还可以有一个通道,来传输弹幕,还可以有频道,来传输 点赞、转发、收藏数据还可以有频道来传输 评论 数据搞成多个频道,就可以在某种数据发生问题的时候不会对其他数据造成影响.(解耦合)

 微博 Timeline

每个用户都有属于自己的 Timeline(微博列表),现需要分页展示文章列表。此时可以考虑使用列

表,因为列表不但是有序的,同时支持按照索引范围获取元素。

1)每篇微博使用哈希结构存储,例如微博中 3 个属性:title、timestamp、content:

2)向用户 Timeline 添加微博,user:<uid>:mblogs 作为微博的键:

3)分页获取用户的 Timeline,例如获取用户 1 的前 10 篇微博:

💡 选择列表类型时,请参考:

同侧存取(lpush + lpop 或者 rpush + rpop)为栈

异侧存取(lpush + rpop 或者 rpush + lpop)为队列

http://www.dtcms.com/a/324871.html

相关文章:

  • 通过脚本修改MATLAB的数据字典
  • 【15】OpenCV C++实战篇——fitEllipse椭圆拟合、 Ellipse()画椭圆
  • 【人工智能99问】BERT的原理什么?(23/99)
  • Elasticsearch 保姆级入门篇
  • SpringBoot查询方式全解析
  • 在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合
  • 数字图像处理2——图像增强
  • AI(1)-神经网络(正向传播与反向传播)
  • 【RL第七篇】PPO训练策略,如何使PPO训练稳定?
  • unity中如何让原人物动画兼容新人物的动画
  • 异步问题的概念和消除问题技巧
  • Graph-R1:一种用于结构化多轮推理的智能图谱检索框架,并结合端到端强化学习
  • 【面板数据】全国及各省份技术市场成交额数据-dta+xlsx格式(2001-2023年)
  • nginx+lua+redis案例
  • 《Webpack与Vite热模块替换机制深度剖析与策略抉择》
  • 消息生态系统全景解析:技术架构、核心组件与应用场景
  • 【Python练习】085. 编写一个函数,实现简单的DNS服务器功能
  • LeeCode 46. 全排列
  • 【树\思维】P1395 会议
  • 33.搜索旋转排序数组
  • Agno智能体框架简单使用
  • docker等基础工具使用
  • 从策略梯度到 PPO
  • java中的继承
  • Flutter开发 LinearProgressIndicato、CircularProgressIndicator
  • django基于Python的设计师作品平台的数据可视化系统设计与实现
  • QT的常用控件说明
  • Java基础—解析注解
  • 游戏常用运行库合集:一键解决游戏兼容性问题
  • 锂电池SOH预测 | 第35讲 Matlab基于BiLSTM的锂电池健康状态估计(锂电池SOH预测),附锂电池最新文章汇集