Redis 数据类型和各自的使用场景

Redis 数据类型和各自的使用场景

  • 1、String类型
  • 2、List类型
  • 3、Hash类型
  • 4、Set类型
  • 5、Zset类
  • BitMap:
  • HyperLogLog:
  • GEO:.
  • Stream:
  • 跳表

常见的有五种数据类型:String字符串,List列表,Hash哈希,Set集合、Zset有序集合。

1、String类型

String适用场景:一般用于缓存字符串对象
它底层的数据结构是 SDS简单动态字符串。
1、SDS 不仅可以保存文本数据,而且能保存图片、视频、压缩文件这样的二进制数据。
2、SDS 获取字符串长度的效率更高,用 len 属性记录了字符串长度,时间复杂度大约是 O(1)。而C 语言的字符串没有len, O(n);
3、Redis 的 SDS API 是安全的,拼接字符串不会造成缓冲区溢出,因为拼接之前会先检查,如果空间不够就自动扩容。

2、List类型

List场景:一般用于任务队列
底层数据结构由 quicklist 快表实现。
Quicklist :「双链表 + 压缩列表」组合,一个 quicklist 就是一个链表,而链表中的每个元素是一个压缩列表。
压缩列表:是一块连续的内存空间,有点像数组。但是它有一个记录前一个元素长度的字段,主要是帮助快速定位到列表中的下一个元素,从而提高遍历效率。但是有【连锁更新】的问题。

  • 前一个节点长度 < 254 字节,prevlen 需要用 1 字节的空间来保存这个长度值
  • 前一个节点长度 > 254 字节,prevlen 需要用 5 字节的空间来保存这个长度值
  • 本来都在250~253 之间,因为前面插入了新的导致最前面大于254,后面都跟着变了
    解决办法:控制每个链表节点中的压缩列表的元素个数,来规避连锁更新的问题。因为压缩列表元素越少,连锁更新带来的影响就越小。

3、Hash类型

Hash场景:购物车等。
键:cart:123 、字段:product:456、值:2 (用户123的购物车里有456产品,购物车里456产品的数量是2)
在 Redis 7.0 中,由 listpack 数据结构来实现。
listpack 是在压缩列表的基础上改造而来的,它没有压缩列表中记录前一个节点长度的字段了,只记录当前节点的长度,所以加入新元素的时候,不会影响其他节点的长度字段的变化,从而避免了压缩列表的连锁更新问题。

4、Set类型

Set 场景:一些聚合计算场景,比如点赞、共同关注等。
Set 类型的底层数据结构是由哈希表或整数集合实现的:
如果集合中的元素都是整数且元素个数小于默认的 512 个,Redis 会使用整数集合作为 Set 类型的底层数据结构;
如果集合中的元素不满足上面条件,则 Redis 使用哈希表作为 Set 类型的底层数据结构。

5、Zset类

Zset场景:排序场景,比如Rank排行榜、姓名排序等。
Zset 类型的底层数据结构是由 listpack 数据结构来实现。
Redis 后续版本又支持四种数据类型,它们的应用场景如下:

BitMap:

二值状态统计的场景,比如签到、判断用户登陆状态等;

HyperLogLog:

海量数据基数统计的场景,比如百万级网页访问量计数等;

GEO:.

存储地理位置信息的场景,比如滴滴叫车;

Stream:

消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据。

跳表

跳表其实是一种多层的有序链表,跳表在原有的有序链表基础上结合二分查找的思想增加了多级索引,通过索引来实现快速查询。
我们知道对于一个单链表来说,即使它有序,查找的时间复杂度还是O(n)。我们可以做一些优化,每两个结点提取一个"索引"到上一级,上一级有到下一级的指针。那如果链表数据是1-10,正常查找是O(n),有了索引之后就可以2、4、6、8这样来查找,甚至说数据多的话可以建立三层四层索引,以此来提升工作效率。
跳表的查询、插入、删除时间复杂度都是O(logn),空间复杂度是 O(n)

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

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

相关文章

一天跌20%,多只可转债“腰斩”,近百只跌破面值,“退可守”的香饽饽为何破防?

专业人士指出&#xff0c;近期部分可转债大跌原因主要有两点&#xff1a;一方面&#xff0c;转债市场与权益市场联动性强。另一方面&#xff0c;近期公布的宏观经济数据稳中趋缓&#xff0c;“供强需弱”特征依然明显&#xff0c;证监会主席吴清发言及“科创板八条”新规延续了…

在举办数字化营销活动前该如何做客户画像和制定营销方案

在当今数字化时代&#xff0c;举办成功的营销活动离不开对客户的精准了解。而根据产品属性来描绘客户画像&#xff0c;并据此制定营销方案&#xff0c;是提高营销效果的关键。 一、产品属性分析 首先&#xff0c;咱们得好好琢磨一下产品本身。比如说&#xff0c;如果是一款…

基于幅值判断的工频故障分量距离保护

统的继电保护原理是基于工频电气量的&#xff0c;但近年来&#xff0c;反应故障分量的高速继电保护原理在微机保护装置中被广泛应用。故障分量只在设备发生故障时才出现&#xff0c;因此可以用叠加原理来分析其特征。 将电力系统发生的故障视为非故障状态与故障附加状态的叠加…

数据产品赋能数字化转型

数据产品赋能数字化转型 引言:数据产品的创新与发展:赋能决策智能化的钥匙一、数据产品的定义与特征二、数据产品的核心功能三、应用实践与案例分析四、未来展望引言:数据产品的创新与发展:赋能决策智能化的钥匙 在数字化转型的浪潮下,数据已成为企业核心竞争力的关键要素…

Http客户端-Feign 学习笔记

作者介绍&#xff1a;计算机专业研究生&#xff0c;现企业打工人&#xff0c;从事Java全栈开发 主要内容&#xff1a;技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流&#xff08;SCI论文两篇&#xff09; 上点关注下点赞 生活越过…

6.26.1 残差卷积变压器编码器的混合工作流程用于数字x线乳房x光片乳腺癌分类

基于残差卷积网络和多层感知器变压器编码器(MLP)的优势&#xff0c;提出了一种新型的混合深度学习乳腺病变计算机辅助诊断(CAD)系统。利用骨干残差深度学习网络创建深度特征&#xff0c;利用Transformer根据自注意力机制对乳腺癌进行分类。所提出的CAD系统具有识别两种情况乳腺…

索引:通往高效查询的桥梁(五)

引言 上一章&#xff0c;我们探索了SQL的基础知识&#xff0c;从DDL、DML到DQL&#xff0c;掌握了构建和操作数据库的基本技能。现在&#xff0c;我们将目光转向数据库性能的核心——索引。索引&#xff0c;犹如图书馆中的目录系统&#xff0c;极大地加速了数据检索过程&#…

cmd设置编码为utf8

文章目录 临时设置永久设置(通过注册表) cmd命令乱码&#xff0c;解决方案比较简单。 输入chcp&#xff0c; 如果返回的是936&#xff0c;通常是GBK或CP936。 如果返回的是65001&#xff0c;表示是UTF-8。 临时设置 chcp 65001 # 设置 chcp # 查看 永久设置(通过注册表) 打…

等保1.0与2.0:物理环境安全的演进之路

在信息安全的大厦中&#xff0c;物理环境安全是那坚实的基础&#xff0c;承载着整个信息系统的稳定与安全。随着时间的推移&#xff0c;我国的信息安全等级保护标准也在不断地进化与完善&#xff0c;从等保1.0到等保2.0&#xff0c;不仅仅是数字上的递增&#xff0c;更是对物理…

通用后台管理系统(一)——项目介绍

目录 二、文档结构 src文件夹&#xff1a; 三、技术和插件 1、Vue router 2、element-ui框架 3、样式插件less 4、vuex状态管理 5、axios.js 6、mock.js模拟数据 7、echarts图表工具 四、项目效果展示 总结 一、项目介绍 通用后台管理是采用vue2cli开发的项目&#…

QLibrary::load、QPluginLoader::instance加载错误

现象 在使用pluginLoader.instance()总是为空&#xff0c;通过pluginLoader.errorString()获取的错误是 “Cannot load library xxxPlugin.dll: 找不到指定的程序。” 原因 是否缺少依赖的dll&#xff1b;依赖的dll是否在程序的运行中&#xff1b;依赖的dll的版本是否正确&am…

Sql审核平台Archery的搭建和简单配置

Sql审核平台Archery的搭建和简单配置 Archery是一个开源的Web应用&#xff0c;基于Python开发&#xff0c;利用Flask作为后端框架&#xff0c;前端采用Vue.js&#xff0c;构建了一个现代化的数据操作界面。提供了SQL审核、数据查询、报表生成等功能&#xff0c;同时支持多种数据…

async异步函数

文章目录 异步函数&#xff08;用 async 声明的函数&#xff09;异步函数的返回值async/await 的使用异步函数的异常处理总结 感谢铁子阅读&#xff0c;觉得有帮助的话点点关注点点赞&#xff0c;谢谢&#xff01; 异步函数&#xff08;用 async 声明的函数&#xff09; 异步函…

yolov8部署资料

1.labelImg安装&#xff1a; labelImg的安装过程可以参照以下步骤进行&#xff0c;这里以Windows操作系统为例&#xff1a; 1. 检查Python环境 首先&#xff0c;需要确认你的电脑上是否已经安装了Python。你可以通过Win R打开windows“运行”对话框&#xff0c;输入cmd&#x…

瑶池数据库SQL-问题二的解决方案

瑶池数据库SQL-问题二的解决方案 为什么选问题二问题二准备工作解决方案第一步第二步初步尝试再次尝试主表自关联查询满足条件数据 解题感受 为什么选问题二 个人没有详细的看三个题目的具体内容&#xff0c;只是看了三个题目的题目名称&#xff0c; 最后觉得问题二比较有意思…

1.1 离散信号的时域分析

目录 基本离散信号 单位脉冲序列δ[k] 单位阶跃序列u[k] 矩形序列Rn[k] 实指数序列x[k] 虚指数序列和正弦序列x[k] 基本运算 翻转 位移 抽取 内插 卷积 相关 DSP&#xff08;Digital Signal Processing&#xff09; 数字信号处理 基本离散信号 单位脉冲序…

目标检测系列(四)利用pyqt5实现yolov8目标检测GUI界面

目录 1、pyqt5安装 2、PyCharm添加Qt Designer、PyUIC 3、Qt Designer设计界面 4、根据ui文件自动生成py文件 5、修改py文件来调用检测程序 6、执行py文件启动 1、pyqt5安装 Qt Designer&#xff1a;一个用于创建图形用户界面的工具&#xff0c;可轻松构建复杂的用户界面…

linux kernel slab分配器

slab分配器是一种高效的内存管理机制,主要用于小块内存的分配和释放。 slab分配器简述 slab分配器是一种内存管理机制,它将内存分割成多个"缓存"(cache),每个缓存包含固定大小的对象。这些对象可以是内核数据结构、缓冲区或其他小块内存。 slab分配器用途 高…

还在花钱做数据可视化?为大家推荐一款免费可视化工具

在当今数据驱动的世界里&#xff0c;数据可视化已经成为不可或缺的工具&#xff0c;帮助我们更好地理解和分析信息。然而&#xff0c;许多企业和个人仍在为昂贵的可视化软件买单&#xff0c;承受着高昂的费用和复杂的操作流程。因此&#xff0c;作为一个经常接触数据可视化的相…

php聚合快递寄快递小程序

一、引言&#xff1a;告别传统寄件&#xff0c;拥抱便捷新选择 在数字化时代&#xff0c;我们越来越追求便捷和高效。传统的寄件方式已经无法满足现代人快速、便捷的需求。因此&#xff0c;一款聚合快递优惠寄件小程序应运而生&#xff0c;它集合了多家快递公司&#xff0c;为…