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

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)为队列

相关文章:

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

目录 List 编码方式 早期版本 现今版本 List 实际应用 多表之间的关联关系 消息队列 频道&#xff08;多列表&#xff09;消息队列 微博 Timeline 栈 & 队列 List 编码方式 早期版本 早期版本 List 类型的内部编码方式有两种 ziplist&#xff08;压缩列表&#xf…...

uni-app page新建以及page外观配置

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

问题:执行conda init 提示 No action taken,然后无法正确激活环境

执行完下面代码后&#xff0c; conda activate base 报错&#xff0c;提示先执行conda init,于是再执行下面代码 conda init发现还报错提示提示 No action taken。 解决方法&#xff1a; 打开一个新的终端窗口&#xff0c;您应该就可以正常使用conda命令。&#xff08;把其…...

SpringBoot 增量/瘦身部署jar 包

背景 SpringBoot 项目的部署一般采用全量jar 包方式部署相关项目&#xff0c;如果我们对相关的Contrller\Service\Dao\Mapper 层进行相关业务调整就需要重新编译全量jar 包&#xff08;包大小约为200M左右&#xff09;实在太麻烦了。 本文:重点讲解使用SpringBoot 的增量/瘦身…...

AI客服的评分机制及自动化测试

智能客服的评分机制及自动化测试 使用pytest来编写智能客服的测试框架&#xff1a; 准备一个CSV文件来存储测试用例和预期结果。编写测试脚本&#xff0c;其中包含测试用例的读取、发送请求、评分逻辑和结果验证。使用pytest断言来验证测试结果。 首先安装pytest和requests库…...

【Matlab】ELM极限学习机时序预测算法

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88681649 一&#xff0c;概述 ELM&#xff08;Extreme Learning Machine&#xff09;是一种单层前馈神经网络结构&#xff0c;与传统神经网络不同的是&#xff0c;ELM的隐层神经元权重以及偏置都是随机产生的…...

m3u8网络视频文件下载方法

在windows下&#xff0c;使用命令行cmd的命令下载m3u8视频文件并保存为mp4文件。 1.下载ffmpeg&#xff0c;访问FFmpeg官方网站&#xff1a;https://www.ffmpeg.org/进行下载 ffmpeg下载&#xff0c;安装&#xff0c;操作说明 https://blog.csdn.net/m0_53157282/article/det…...

相机内参标定理论篇------张正友标定法

一、为什么做相机标定&#xff1f; 标定是为了得到相机坐标系下的点和图像像素点的映射关系&#xff0c;为摄影几何、计算机视觉等应用做准备。 二、为什么需要张正友标定法&#xff1f; 张正友标定法使手工标定相机成为可能&#xff0c;使相机标定不再需要精密的设备帮助。…...

鸿蒙 Window 环境的搭建

鸿蒙操作系统是国内自研的新一代的智能终端操作系统&#xff0c;支持多种终端设备部署&#xff0c;能够适配不同类别的硬件资源和功能需求。是一款面向万物互联的全场景分布式操作系统。 下载、安装与配置 DevEco Studio支持Windows系统和macOS系统 Windows系统配置华为官方推…...

新一代大语言模型在Amazon Bedrock引领人工智能潮流

亚马逊Bedrock平台推出全新Amazon Titan大语言模型&#xff0c;为大型数据集预处理提供强大支持。亚马逊云科技开发者大会演讲重点介绍了Amazon Titan在文本大语言模型领域的创新&#xff0c;以及如何通过Bedrock平台实现定制化应用。 亚马逊Bedrock平台的主要产品经理Brent S…...

kafka实现延迟消息

背景 我们知道消息中间件mq是支持延迟消息的发送功能的&#xff0c;但是kafka不支持这种直接的用法&#xff0c;所以我们需要独立实现这个功能&#xff0c;以下是在kafka中实现消息延时投递功能的一种方案 kafka实现延时消息 主要的思路是增加一个检测服务&#xff0c;这个检…...

python+django高校教材共享管理系统PyCharm 项目

本中原工学院教材共享平台采用的数据库是mysql&#xff0c;使用nodejs技术开发。在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。系统所要实现的功能分析&#xff0c;对于现在网络方便的管理&…...

三子棋(c语言)

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…...

09.kubernetes 部署calico / flannel网络插件

脚本中实现了 calico 和 flannel 这两种主流的网络插件,选择其中一种部署即可 1、calico calico架构 Calico是一个三层的虚拟网络解决方案,它把每个节点都当作虚拟路由器(vRouter),并把每个节点上的Pod都当作是节点路由器后的一个终端设备并为其分配一个IP地址。各节点…...

【DevOps 工具链】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境&#xff08;以php7.0为例 &#xff09;3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…...

ES6的默认参数和rest参数

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…...

深入理解WPF MVVM:探索数据绑定与命令的优雅之道

引言&#xff1a; WPF&#xff08;Windows Presentation Foundation&#xff09;是一种用于创建富客户端应用程序的框架&#xff0c;而MVVM&#xff08;Model-View-ViewModel&#xff09;则是一种在WPF中使用的架构模式。MVVM提供了一种优雅的方式来组织和管理应用程序的代码&a…...

ssrf之gopher协议的使用和配置,以及需要注意的细节

gopher协议 目录 gopher协议 &#xff08;1&#xff09;安装一个cn &#xff08;2&#xff09;使用Gopher协议发送一个请求&#xff0c;环境为&#xff1a;nc起一个监听&#xff0c;curl发送gopher请求 &#xff08;3&#xff09;使用curl发送http请求&#xff0c;命令为 …...

SVN下载安装(服务器与客户端)

1.下载 服务器下载&#xff1a;Download | VisualSVN Server 客户端下载&#xff1a;自行查找 2. 服务器安装 双击执行 运行 下一步 同意下一步 下一步 选中安装目录 3. 客户端安装 双击执行 下一步 4. 服务器创建仓库 5. 服务器创建用户 6. 客户端获取资源 文件夹右键...

SpringIOC之ApplicationObjectSupport

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

香橙派 ubuntu实现打通内网,外网双网络,有线和无线双网卡

当香橙派 ubuntu 连了有线&#xff0c;和无线时&#xff0c;默认请求外网时&#xff0c;只走一个网卡&#xff0c;如走了内网网卡&#xff0c;就只能访问内访问&#xff0c;访问不了外网&#xff1b;走了外网网卡就只能访问外网&#xff0c;访问不了内网&#xff1b; 实现双网…...

Spring Boot简单多线程定时任务实现 | @Async | @Scheduled

Spring Boot简单多线程定时任务实现 实现步骤 1 创建一个Spring Boot项目 2 定义定时任务&#xff1a; package com.jmd.timertasktest.task;import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Async; impor…...

sklearn学习的一个例子用pycharm jupyter

环境 运行在jupyter 进行开发。即一个WEB端的开发工具。能适时显示开发的输出。后缀用的是ipynb.pycharm也可以支持。但也要提示按装jupyter. 或直接用andcoda 这里我们用pycharm进行项目创建 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyterlab pip ins…...

JVM的生命周期

1.加载&#xff08;Loading&#xff09;&#xff1a; 在加载阶段&#xff0c;JVM会找到并加载Java字节码文件。加载阶段分为三个步骤&#xff1a;通过类的全限定名找到对应的字节码文件&#xff0c;创建一个与该类相关的Class对象&#xff0c;将类的静态数据结构存储在方法区中…...

ElasticSearch--基本操作

ElasticSearch 完成ES安装 http://101.42.93.208:5601/app/dev_tools#/console 库的操作 创建索引库 请求方式&#xff1a;PUT 请求路径&#xff1a;/索引库名&#xff0c;可以自定义 请求参数&#xff1a;mapping映射 PUT /test {"mappings": {"propertie…...

大数据应用发展史:从搜索引擎时代到机器学习时代

文章目录 搜索引擎时代数据仓库时代数据挖掘时代机器学习时代小结 大数据技术的使用经历了一个发展过程 从最开始的Google在搜索引擎中开始使用大数据技术&#xff0c;到现在无处不在的各种人工智能应用&#xff0c;伴随着大数据技术的发展&#xff0c;大数据应用也从曲高和寡…...

java基础之String的不可变性

目录 概述 String是如何实现不可变的 String为何设计成不可变的 1.缓存和性能优化 2.安全性 3.线程安全性 4.API设计和预测性能 概述 String类的不可变性意味着一旦创建了一个字符串对象&#xff0c;它的值就不能被修改。 String是如何实现不可变的 查看源码 public …...

【JS】Promise详解

概述 在 JavaScript 中&#xff0c;Promise 是一个表示异步操作最终完成或失败的对象。它本质上是一个返回的对象&#xff0c;你可以附加回调函数&#xff0c;而不是将回调传递给函数。 let promise new Promise((resolve, reject) > {let condition true; // 这可以是某…...

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法

一、最终效果 二、步骤 1、在初始化进入项目时&#xff0c;获取当前主题色 2、把主题色定义成全局变量&#xff08;即在app.js中设置&#xff09; 3、tabBar也需要定义全局变量&#xff0c;在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…...

Java关键字(1)

Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字&#xff1a; public&#xff1a;表示公共的&#xff0c;可以被任何类访问。 private&#xff1a;表示私有的&#xff0c;只能被定义该关键字的类访问。 cl…...

网站建设方案书安全性/网站建设策划书范文

一、认识Web.config文件 Web.config文件是一个XML文本文件&#xff0c;它用来储存 ASP.NET Web 应用程序的配置信息&#xff08;如最常用的设置ASP.NET Web 应用程序的身份验证方式&#xff09;&#xff0c;它可以出现在应用程序的每一个目录中。当你通过VB.NET新建一个Web应用…...

php 怎么做视频网站/宁波seo高级方法

Winform-Controls 0.General 属性名描述TextAlign文本对其方式Enabled是否可用visible是否可见Anchor自适应窗体实现注意事项&#xff1a; 当自动生成控件时候&#xff0c;需要设置Autozie属性为true,要不然Text显示不全。 1.Form 1.1常用属性 // 1.启动位置this.StartPosition…...

网站建设模块有哪些/百度客服人工服务

解决办法&#xff1a; 1. 选中项目 --> 右键 --> Maven --> Disable Maven Nature 此时&#xff0c;右键菜单中将隐藏【Maven】菜单选项 2. 选中项目 --> 右键 --> Configure --> Convert to Maven project. 3. 选中项目-->右键-->Properties-->Dep…...

服务器域名是什么?/seo推广排名平台有哪些

小A是一个中度强迫症患者,每次做数组有关的题目都异常难受,他十分希望数组的每一个元素都一样大,这样子看起来才是最棒的,所以他决定通过一些操作把这个变成一个看起来不难受的数组,但他又想不要和之前的那个数组偏差那么大,所以他每次操作只给这个数组的其中n-1个元素加1, 输入…...

wordpress二级域名设置/传统营销与网络营销的整合方法

spring要与freemarker整合的话&#xff0c;需要两个包&#xff0c;一个是freemarker的jar包&#xff0c;另一个是spring-context-support的jar包。所以我们需要在taotao-item-web工程中确保对这两个jar包的依赖&#xff0c;如下所示。<dependency><groupId>org.spr…...

成都旅游景点攻略/3步打造seo推广方案

做过GUI开发相关工作的人的人都知道&#xff0c;很多应用程序都是事件驱动的。这些事件大部分都来自于用户&#xff0c;比如键盘事件、鼠标事件或遥控器事件。还有一些事件来自于系统内部&#xff0c;比如定时事件、socket事件和其它文件事件等等。在没有任何事件的情况下&…...