2023.12.28 关于 Redis 数据类型 List 内部编码、应用场景

目录

List 编码方式

早期版本

现今版本

List 实际应用

多表之间的关联关系

消息队列

频道(多列表)消息队列

微博 Timeline

栈 & 队列


List 编码方式

早期版本

  • 早期版本 List 类型的内部编码方式有两种
  1. ziplist(压缩列表)
  2. linkedlist(链表)
  • 两个配置项
  1. list-max-ziplist-entries 配置
  2. list-max-ziplist-value 配置

注意:

  • 现版本 Redis 已不再使用这两个配置项
  • 且上述的 两种编码方式 为早期版本 Reids 中的 List 类型内部编码方式

现今版本

  • 现今版本 Redis 使用 quicklist 作为 List 类型的内部编码方式
  • quicklist 相当于 ziplist 和 linkedlist 的结合

  • quicklist 整体上还是一个 linkedlist ,但 linkedlist 的每个节点均为一个 ziplist

特点:

  • 每个节点上的 ziplist 不会太大,且这多个 ziplist 通过链式结构链接起来

配置项:

  • 该配置项描述了每个节点 ziplist 的阈值
  • 当 ziplist 满足阈值,便将其分裂成多个列表节点,即多个 ziplist 
  • 再将这多个 ziplist 通过链式结构链接起来

注意:

  • 观察上图注释信息,ziplist 的阈值为可选项
  • 所以我们还需针对当前业务场景,来选择合适的阈值!

实例理解

  • 我们通过 object encoding key 来查看编码方式

List 实际应用

多表之间的关联关系

  • 可将 list 作为 数组 这样的结构来存储多个元素

实例理解

  • 使用 MySQL 表示学生和班级信息

  • 上图 MySQL 表结构 可以很方便的实现 查询指定班级中有哪些同学
  • Redis 所提供的查询功能 是不如 MySQL 的
  • 所以我们可以通过往 Redis 中插入 List 类型键值对直接将 学生 和 班级信息 进行关联

  • 结合上图实例,Redis 通过 List 类型 便可以将 学生 和 班级信息 关联起来
  • 从而能很轻易的实现 查询指定班级中有哪些同学

注意:

  • 此处除了使用 Hash 类型表示学生信息,也可使用 String + JSON 的方式来表示学生信息
  • 即 具体 Redis 中的数据是如何组织的,都需根据实际的业务情况来决定

消息队列

  • 生产者消费者模型

  • 上图的 brpop 为阻塞操作
  • 当列表为空时,brpop 命令便会阻塞等待,一直等到其他客户端向列表中 lpush 元素为止

重点理解:

  • 此处 只有一个消费者能抢到元素

通俗理解:

  • 谁先执行的 brpop 命令,谁就能拿到这个新 lpush 的元素
  • 该设定便能很好的构成 "轮询" 效果

实例理解

  • 假设此时列表为空,三个消费者(A、B、C)按顺序执行 brpop 命令进行阻塞等待
  • 即执行顺序为 消费者A ——> 消费者B ——> 消费者C
  • 当有新元素到达列表时,该新元素将被 消费者A 获取,且 brpop 命令立即返回,标志着 消费者A 完成了一次消费操作
  • 若消费者A 想要继续消费,必须再次执行 brpop 命令
  • 此时执行顺序变为 消费者B ——> 消费者C ——> 消费者A
  • 如果再有新元素到达,消费者B 将获取该元素,且 brpop 命令立即返回,标志着 消费者 B 完成了一次消费操作

总结:

  • 上述实例所描述的这种轮询方式,即消费者们按照固定的顺序交替执行 brpop 命令
  • 很好的实现了对阻塞队列的有序消费

频道(多列表)消息队列

  • 多列表/频道 这种场景是比较常见的

实例理解

  • 日常使用的程序,比如抖音
  • 一个频道 用来传输短视频数据
  • 一个频道 用来传输弹幕
  • 还可以有多个频道,用来传输点赞、转发、收藏、评论数据

优点:

  • 多频道模式 一定程度上保证了在某种数据发生问题的时候,不会对其他数据造成影响
  • 具有一定的 解耦合 作用

微博 Timeline

  • 每个用户都拥有属于自己的 Timeline(微博列表),现需要分页展示文章列表
  • 此时便可以考虑使用列表,因为列表不但是有序的,且支持按照索引范围获取元素

实例理解

  • 每篇微博使用 哈希结构存储
  • 此处包含三个属性(title、timestamp、content)
hmset mblog:1 title xx timestamp 1476536196 content xxxxx
...
hmset mblog:n title xx timestamp 1476536196 content xxxxx
  • 向用户 Timeline 添加微博,使用 List 类型
  • 此处使用 user:<uid>:mblogs 作为微博的键
lpush user:1:mblogs mblog:2 mblog:4
...
lpush user:k:mblogs mblog:n
  • 分页获取用户的 Timeline
  • 此处假设获取用户1 的前 5 篇微博
keylist = lrange user:1:mblogs 0 4
for key in keylist {hgetall key
}

问题一:

  • 当前一页中有多少数据是不确定,所以有可能会导致 for 循环比较大
  • 从而会触发多次 hgetall 命令,即多次 网络请求

解决方法:

  • 使用 pipeline(流水线、管道)
  • 虽然此处是多个 Redis 命令,但是通过 pipeline 我们可以将这些命令合并成一个 网络请求 进行通信
  • 由此可以大大降低 客户端 和 服务器 之间的交互次数

问题二:

  • lrange 在列表两端表现较好,获取列表中间的元素表现较差

解决方案:

  • 将文章对应的 list 进行切分
  • 假设某用户发布了 1w 篇微博,则 list 的长度为 1w
  • 如果将这 1w 篇微博拆分成 10 份,即 每份1k 篇微博
  • 此时如果想获取第 5k 篇左右的微博
  • 即直接找到第五个列表,进行遍历即可
  • 通过这样的拆分方式便能降低单个 list 的长度,并加快中间位置元素的查询速度

栈 & 队列

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

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

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

相关文章

Cisco模拟器-企业网络部署

某企业园区网有&#xff1a;2个分厂&#xff08;分别是&#xff1a;零件分厂、总装分厂&#xff09;1个总厂网络中心 1个总厂会议室&#xff1b; &#xff08;1&#xff09;每个分厂有自己的路由器&#xff0c;均各有&#xff1a;1个楼宇分厂网络中心 每个楼宇均包含&#x…

004、变量与可变性

1. 变量与可变性 在Rust中&#xff0c;变量默认是不可变的&#xff0c;这一设计是为了让你安全方便地写出复杂、甚至是并行的代码。 当然&#xff0c;Rust也提供了可使用的可变变量的方法&#xff0c;这个待会讨论。 当一个变量是不可变时&#xff0c;一旦它被绑定到某个值上面…

Java之程序、进程、线程、管程和并发、并行的概念

文章目录 1. 进程与线程1.1 程序1.2 进程1.3 线程1.4 管程 2.并行与并发2.1 并发2.2 并行 1. 进程与线程 1.1 程序 程序是指令和数据的有序集合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念。简单的说就是我们写的代码。 1.2 进程 &#xff08;1&…

分布式系统架构设计之分布式数据存储的分类和组合策略

在现下科技发展迅猛的背景下&#xff0c;分布式系统已经成为许多大规模应用和服务的基础架构。分布式架构的设计不仅仅是一项技术挑战&#xff0c;更是对数据存储、管理和处理能力的严峻考验。随着云原生、大数据、人工智能等技术的崛起&#xff0c;分布式系统对于数据的高效存…

科技云报道:开源才是大模型的未来?

科技云报道原创。 一年前&#xff0c;ChatGPT横空出世&#xff1b;7个多月后&#xff0c;Meta宣布开源LLaMA 2&#xff0c;并且可免费商用。 这一天&#xff0c;也成为大模型发展的分水岭。短时间内&#xff0c;LLaMA 2对一些闭源的大模型厂商造成了致命性的打击。 随后&…

【力扣100】207.课程表

添加链接描述 class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:# 思路是计算每一个课的入度&#xff0c;然后使用队列进行入度为0的元素的进出# 数组&#xff1a;下标是课程号&#xff0c;array[下标]是这个课程的入度# 哈希…

轻松调整视频时长,创意与技术的新篇章

传统的视频剪辑工具往往难以精确控制时间&#xff0c;而【媒体梦工厂】凭借其先进的算法和界面设计&#xff0c;让视频时长的调整变得简单而精确&#xff0c;助你释放无限的创意&#xff0c;用技术为你的创意插上翅膀&#xff0c;让每一秒都有意义。 所需工具&#xff1a; 一…

性能优化-如何提高cache命中率

本文主要介绍性能优化领域常见的cache的命中率问题&#xff0c;旨在全面的介绍提高cache命中率的方法&#xff0c;以供大家编写出性能友好的代码&#xff0c;并且可以应对性能优化领域的面试问题。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &am…

听GPT 讲Rust源代码--src/tools(38)

File: rust/src/tools/clippy/clippy_dev/src/lib.rs rust/src/tools/clippy/clippy_dev/src/lib.rs文件是Clippy开发工具的入口文件&#xff0c;其作用是提供Clippy开发过程中所需的功能和工具。Clippy是一个Rust代码的静态分析工具&#xff0c;用于提供各种有用的代码规范、编…

C++day4作业

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

java企业网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web企业网站系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

科技创新实验室数据管理优选:高效企业网盘推荐

科技创新实验室建设是国家加强科技创新基本能力建设的重要措施&#xff0c;企业网盘等高效办公工具的应用是保证科技创新实验室正常运行、提高科研项目团队合作效率的重要手段。 本文将介绍企业网盘Zoho WorkDrive提供的解决方案&#xff1a; 行业痛点1&#xff1a;分散的数据…

听GPT 讲Rust源代码--src/tools(39)

File: rust/src/tools/rustfmt/src/config/config_type.rs 在Rust代码中&#xff0c;rust/src/tools/rustfmt/src/config/config_type.rs文件的作用是定义了与配置相关的数据结构和函数。 Config struct&#xff08;配置结构体&#xff09;&#xff1a;该结构体用于存储rustfmt…

图形化编程(3)之猜拳的加速度计

今天说我们来学习图形化第三节内容&#xff0c;加速度计。加速度传感器是一种能够测量物体加速度的传感器&#xff0c;在运动过程中&#xff0c;通过测量质量的惯性力和牛顿第二定律得到加速度。 根据传感器敏感元件的不同&#xff0c;常见的加速度传感器有电容式、电感式、应变…

zookeeper之集群搭建

1. 集群角色 zookeeper集群下&#xff0c;有3种角色&#xff0c;分别是领导者(Leader)、跟随着(Follower)、观察者(Observer)。接下来我们分别看一下这三种角色的作用。 领导者(Leader)&#xff1a; 事务请求&#xff08;写操作&#xff09;的唯一调度者和处理者&#xff0c;保…

音频播放软件Foobar2000 mac特点介绍

Foobar2000 mac是一款高度可定制的音频播放器&#xff0c;适用于Windows平台。它支持各种音频格式&#xff0c;包括MP3、FLAC、AAC、WMA等&#xff0c;同时也支持各种音频插件和效果器&#xff0c;可以提供更好的音质和用户体验。 Foobar2000 mac软件特点 1. 高度可定制&#…

信号类型——正交频分复用(OFDM)

系列文章目录 《信号类型&#xff08;通信&#xff09;——仿真》 《信号类型&#xff08;通信&#xff09;——QAM调制信号》 《信号类型&#xff08;通信&#xff09;——QPSK、OQPSK、IJF_OQPSK调制信号》 《信号类型&#xff08;通信&#xff09;——最小频移键控&…

【C语言】分支与循环语句

什么是语句&#xff1f; C语句可分为以下五类&#xff1a; 表达式语句函数调用语句控制语句 &#xff08;本篇重点介绍&#xff09;复合语句空语句 控制语句用于控制程序的执行流程&#xff0c;以实现程序的各种结构方式。C语言支持三种结构&#xff1a; 顺序结构选择结构循…

软件设计师——软件工程(三)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

使用SecoClient软件连接L2TP

secoclient软件是华为防火墙与友商设备进行微屁恩对接的一款软件,运行在windows下可以替代掉win系统自带的连接功能,因为win系统自带的连接功能总是不可用而且我照着网上查到的各种方法调试了很久都调不好,导致我一度怀疑是我的服务没搭建好,浪费了大把时间去研究其他搭建方案 …