Redis 中 List 数据结构详解

news2024/11/26 6:53:43

目录

List

用法

1. 增

2. 删

3. 查

内部编码

应用场景


前言

Redis 中的 List 和 Set 数据结构各有特点,适用于不同的应用场景。List 提供了有序的列表结构,适合用于消息队列和任务列表等场景;Set 提供了无序且不重复的集合结构,适合用于标签系统和唯一性检测等场景。通过合理选择和使用 Redis 的数据结构,可以有效提升系统的性能和扩展能力。


List

用法

List 是一个简单的链表,支持从两端进行插入和删除操作。


常见命令:

1. 增

插入一个或多个元素到列表的左端。

lpush key value [value ...]

lpushx key value [value ...]( key存在时插入 )

返回值 :list 的长度 

插入一个或多个元素到列表的右端。

rpush key value [value ...]

rpushx key value [value ...]( key存在时插入 )

返回值: list的长度

在指定位置插入元素

linsert key <before | after> pivot element

进行插入的时候,从左往右找到第一个基准值进行插入

返回值:新的 list 的长度 

2. 删

删除并返回列表的左端元素。

lpop key

lpop key [count]( 6.2版本在后面可以设置删除的个数)

返回值: 被删除的元素/nil(空)

删除并返回列表的右端元素。

rpop key

返回值:  被删除的元素/nil(空)

删除指定的元素

lrem key count(要删除的数量) element(要删除的值)

count > 0 : 从左往右找,删除

count < 0 : 从右往左找,删除

count = 0 : 删除所有的

删除范围外的元素 

ltrim key start stop(前闭后闭)

阻塞删除 

brpop / blpop key [key ...] timeout(秒)


当 list 为空的时候,会进行阻塞(等待),但是这个期间 Redis 可以执行其他命令!!!

返回值:

1. 非空时,会返回删除的是哪个key的哪个值

eg:blpop key 0

(1)"key"

(2)"1"

2. 为空时,会进行阻塞,当有数据的时候,进行 pop

3. 查

返回列表中指定范围内的元素。

lrange key start stop(前闭后闭)

超过范围的话,只会返回范围内的元素,不会报错。 

返回列表的长度。 

llen key

根据下标获取元素 

lindex key index


内部编码

以前的Redis编码

ziplist:当列表中的元素数量较少且每个元素都比较小时,Redis 使用紧凑的 ziplist 结构。ziplist 是一种连续内存块,存储在一个数组中,可以有效减少内存占用。

linkedlist:当列表变大或元素变复杂时,Redis 会自动切换到 linkedlist 编码。这是一种双向链表,适合频繁的插入和删除操作。

如今的Redis编码

quicklist:取其精华,去其糟粕!!!整体是一个链表,但是每个节点是一个不是很大的压缩列表(ziplist)。


应用场景

消息队列:可以利用 LPUSHBRPOP 命令实现一个简单的消息队列,生产者通过 LPUSH 插入消息,消费者通过 BRPOP 获取消息。

微博Timeline:每个用户都有属于⾃⼰的 Timeline(微博列表),现需要分页展示文章列表。此时可以考虑使⽤列表,因为列表不但是有序的,同时⽀持按照索引范围获取元素。

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

hmset mblog:1 title xx timestamp 1476536196 content xxxxx

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

lpush user:1:mblogs mblog:1 mblog:3

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

keylist = lrange user:1:mblogs 0 9
for key in keylist {
 hgetall key
}

问题:

1. 当每次分页过多的时候,需要进行多次 hgetall 操作,这是可以考虑进行 pipeline (流水线)进行批量进行提交命令。

2. 分裂获取文章时,lrange 在列表两端表现比较好,但是中间比较差,此时可以考虑进行拆分。

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

任务列表:在任务处理系统中,可以使用 List 存储待处理的任务,工作线程从列表中获取任务进行处理。

最新消息:将最新消息存储在 List 中,通过 LRANGE 命令获取最新的 N 条消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1708857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【全开源】旅游系统源码(Uniapp+FastAdmin+ThinkPHP)

一款基于UniappFastAdminThinkPHP开发的旅游系统&#xff0c;包含消费者端&#xff08;手机端&#xff09;、机构工作人员&#xff08;手机端&#xff09;、机构端&#xff08;PC&#xff09;、平台管理端&#xff08;PC&#xff09;。机构可以发布旅游线路、景点项目&#xff…

Wpf 使用 Prism 实战开发Day27

首页汇总和数据动态显示 一.创建首页数据汇总数据接口 汇总&#xff1a;待办事项的总数已完成&#xff1a;待办事项里面有多少条完成的待办完成比例&#xff1a;已完成和汇总之间的比例备忘录&#xff1a;显示备忘录的总数待办事项&#xff1a;显示待办事项未完成的集合备忘录&…

Java实现对PDF、纵向、横向页面添加自定义水印功能

Java实现对PDF、纵向、横向页面添加自定义水印 效果图 -- 纵向 页面PDF使用到JAR Maven依赖版本效果图 -- 横向页面PDF 效果图 – 纵向 页面PDF 代码如下&#xff1a; 使用到JAR Maven依赖版本 <dependency><groupId>org.apache.pdfbox</groupId><artifa…

视频监控平台AS-V1000 的场景管理,一键查看多画面视频的场景配置、调用、管理(一键浏览多路视频)

目录 一、场景管理的定义 二、场景管理的功能和特点 1、功能 &#xff08;1&#xff09;场景配置 &#xff08;2&#xff09;实时监控 &#xff08;3&#xff09;权限管理 2、特点 三、AS-V1000的场景配置和调用 1、场景配置 &#xff08;1&#xff09;实时视频预览 …

【Linux】Linux的权限_2 + Linux环境基础开发工具_1

文章目录 三、权限3. Linux权限管理修改文件的拥有者和所属组 4. 文件的类型5. 权限掩码 四、Linux环境基础开发工具1. yumyum 工具的使用 未完待续 三、权限 3. Linux权限管理 修改文件的拥有者和所属组 在上一节我们讲到如何更改文件的访问权限&#xff0c;那我们需要更改…

在VS Code中进行Java的单元测试

在VS Code中可以使用 Test Runner for Java扩展进行Java的测试执行和调试。 Test Runner for Java的功能 Test Runner for Java 结合 Language Support for Java by Red Hat 和 Debugger for Java这两个插件提供如下功能&#xff1a; 运行测试&#xff1a; Test Runner for …

算法打卡 Day13(栈与队列)-滑动窗口最大值 + 前 K 个高频元素 + 总结

文章目录 Leetcode 239-滑动窗口最大值题目描述解题思路 Leetcode 347-前 K 个高频元素题目描述解题思路 栈与队列总结 Leetcode 239-滑动窗口最大值 题目描述 https://leetcode.cn/problems/sliding-window-maximum/description/ 解题思路 在本题中我们使用自定义的单调队列…

②单细胞学习-组间及样本细胞比例分析

目录 数据读入 每个样本各细胞比例 两个组间细胞比例 亚组间细胞比例差异分析&#xff08;循环&#xff09; 单个细胞类型亚新间比例差异 ①单细胞学习-数据读取、降维和分群-CSDN博客 比较各个样本间的各类细胞比例或者亚组之间的细胞比例差异 ①数据读入 #各样本细胞…

ios 端如何免费使用Emby???(利用Quantumult X )

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 注意&#xff1a;使用此激活方式&#xff0c;有唯一缺点&#xff0c;在观看Emby时需保持Quantumult X为开启状态&#xff01; 一、安装证书 开启 MitM 后…

android11禁止进入屏保和自动休眠

应某些客户要求&#xff0c;关闭了开机进入屏保&#xff0c;一段时间会休眠的问题。以下diff可供参考&#xff1a; diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/value…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(十六)- JUC(2)

目录 同步 两阶段终止模式 守护线程 线程状态 五种(操作系统角度) 六种(Java API角度) 烧水案例 共享模型之管程 临界区 竞态条件 同步 Slf4j(topic "c.TestJoin")public class TestJoin {static int r 0;static int r1 0;static int r2 0;​public sta…

微软为团队推出了 Copilot

微软希望使其生成式人工智能品牌对团队更有用&#xff0c;特别是跨公司和大型企业组织的团队。 在年度 Build 开发者大会上&#xff0c;微软宣布推出 Team Copilot&#xff0c;这是其 Copilot 系列生成式 AI 技术的最新扩展。 与微软之前的 Copilot 品牌产品不同&#xff0c;…

[IMX6ULL驱动开发]-Linux对中断的处理(二)

上一篇文章中&#xff0c;引入了Linux对于中断的一些简略流程以及中断抽象为具体实际形象。此文章主要是继续加深对Linux对中断的处理流程以及一些相应的数据结构。 目录 Linux对中断的扩展&#xff1a;硬件中断、软件中断 多中断处理 中断上下部处理流程 发生中断A&#…

简单随机数据算法

文章目录 一&#xff0c;需求概述二&#xff0c;实现代码三、测试代码四、测试结果五、源码传送六、效果演示 一&#xff0c;需求概述 系统启动时&#xff0c;读取一组图片数据&#xff0c;通过接口返回给前台&#xff0c;要求&#xff1a; 图片随机相邻图片不重复 二&#…

blender复制uv贴图

1、新建两个猴头 2、点击其中一个进入uv编辑模式 3、在uv编辑中打开一个图像 4、新建一个材质球&#xff0c;将图像渲染到模型上 打开图像纹理 选择刚才打开的图像 切换到材质预览模式后&#xff0c;就可以看到贴图了 5、选择一个孤岛 6、然后选择拼排孤岛 可以看到该模型展开…

「报名中」5月31日,和PolarDB开源社区一起去娃哈哈!

5月31日&#xff08;周五&#xff09;&#xff0c;PolarDB开源社区将联合娃哈哈集团共同举办开源数据库技术沙龙&#xff01; 本次活动我们邀请到PolarDB产品研发、数据库工具、数据库管控平台、数据库人才教育等各领域专家和老师&#xff0c;参与分享和交流&#xff0c;共同推…

Windows UWP ContentDialog去掉阴影(全透明)的实现

一、前言 在WIndows开发中&#xff0c;使用UWP&#xff08;Universal WIndows&#xff09;项目开发过程中&#xff0c;使用ContentDialog 的过程中&#xff0c;我们可能并不满足现有的样式&#xff0c;这时就需要自定义样式。笔者在自定义样式过程中&#xff0c;遇到了一个难题…

算法002:复写零

力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/duplicate-zeros/ 使用 双指针 来解题&#xff1a; 具体思路 如果是和00…

PHP开发入门

PHP官网&#xff1a;PHP: Hypertext Preprocessor apache官网&#xff1a;https://httpd.apache.org/ 一、搭建PHP环境 下载apache 进入官网点击download 选择下载windows版本文件 点击进入下载界面 点击下载64位版本文件 下载后解压文件 解压文件后进入 D:\httpd-2.4.59-24…

百度智能云千帆AppBuilder升级!开放多源模型接入,思考模型再次加速!

>>【v0.5.4版本】 上线时间&#xff1a;2024/5/24 关键发版信息&#xff1a; 大模型优化&#xff1a;开放多源模型接入&#xff0c;思考模型再次加速&#xff01; Agent思考模型&#xff1a;新增AppBuilder专用版模型ERNIE Speed-AppBuilder&#xff0c;自主任务规划…