Redis 数据结构

Redis 数据类型以及使用场景分别是什么?

Redis 提供了丰富的 数据类型 , 常见的有五种数据类型:String(字符串),Hash(哈希),List(列表)、Set(集合)、Zset(有序集合)。

随着Redis 版本更新,后面又支持了四种数据类型:BitMap(2.2版本新增)、HyperLogLog(2.8 版本新增)、GEO(3.2版本新增)、Stream(5.0版本新增)。Redis 五种数据类型的应用场景:

  • String 类型的应用场景:缓存对象、常规计数、分布式锁、共享session信息等。
  • List 类型的应用场景:消息队列(但是有两个问题:1、生产者需要自行实现全局唯一 ID;2、不能以消费组形式消费数据)等。
  • Hash 类型:缓存对象、购物车等
  • Zset 类型:排序场景,比如排行榜、姓名和电话排序等。
  • set 类型:聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。

Redis 后续支持的四种数据类型,应用场景如下:

  • BitMap(2.2 版本新增):二值状态统计的场景,比如签到、判断用户登录状态、连续签到用户总数等
  • HyperLogLog(2.8 版本新增):海量数据基数统计的场景,比如百万级网页UV计数等
  • GEO(3.2 版本新增):存储地理位置信息的场景,比如滴滴叫车
  • Stream(5.0 版本新增):消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据

五种常见的 Redis 数据类型是怎么实现的?

String 类型的内部实现

String类型的底层的数据结构实现主要是 SDS (简单动态字符串)。SDS和我们认识的 C 字符串不太一样,之所以没有使用 C 语言的字符串表示,因为 SDS 相比于 C 的原生字符串:

  • SDS 不仅可以保存文本数据,还可以保存二进制数据。因为 SDS 使用 len 属性的值而不是空字符来判断字符串是否结束,并且 SDS 的所有 API 都会以处理二进制的方式来处理SDS存放在 buf[] 数组里的数据。所以SDS不光能存放文本数据,而且能够保存图片、音频、视频、压缩文件这样的二进制数据。
  • SDS获取字符串长度的时间复杂度是O(1) .因为 C 语言的字符串并不记录自身长度,所以获取长度的复杂度为 O(n);而SDS结构里用 len 属性记录了字符串的长度,所以复杂度为 O(1)。
  • Redis 的SDS API是安全的,拼接字符串不会造成缓冲区溢出。因为 SDS 在拼接字符串之前会检查 SDS 空间是否满足需求,如果空间不够会自动扩容,所以不会导致缓冲区溢出的问题。

List 类型内部实现

List 类型的底层数据结构是由双向链表或压缩列表实现的:

  • 如果列表的元素个数小于 512 个 (默认值),列表每个元素的值都小于 64 字节(默认值),Redis 会使用 压缩列表 作为 List 类型的底层数据结构
  • 如果列表的元素不满足上面的条件,Redis 会使用双向链表作为 List 类型的底层数据结构;

但是在 Redis 3.2 版本之后,List 数据类型底层数据结构就只由 quickList 实现了,替代了双向链表和压缩列表

Hash 类型内部实现

Hash 类型的底层数据结构是由 压缩列表或哈希表 实现的:

  • 如果哈希类型元素个数小于 512 个(默认值),所有值小于 64 字节(默认值) 的话,Redis 就会使用压缩列表作为 Hash 类型的底层数据结构;
  • 如果哈希类型元素不满足上面条件,redis 会使用哈希表作为 Hash 类型的底层数据结构。

在 Redis 7.0 中,压缩列表数据结构已经废弃了,交由 listpack 数据结构实现了

Set 类型内部实现

Set 类型的底层数据结构是由哈希表或整数集合实现的:

  • 如果集合中的元素都是整数且元素个数小于 512 个 ,Redis 会使用整数集合作为 Set 类型的底层数据结构;
  • 如果集合中的元素不满足上面条件,则 Redis 使用 哈希表 作为 Set 类型的底层数据结构。

ZSet 类型内部实现

ZSet 类型的底层数据结构是由压缩列表或跳表实现的:

  • 如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用 压缩列表 作为 Zset 类型的底层数据结构;
  • 如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为Zset类型的底层数据结构

在Redis 7.0 中,压缩列表数据结构已经废弃了,交由 listpack 数据结构来实现

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

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

相关文章

数据结构之单链表

目录 前言: 链表的定义与结构 单链表的接口实现 显示单链表 创建新结点 单链表尾插 头插的实现简单示例图 尾插经典错误示例1 尾插经典错误示例2 尾插函数的最终实现 单链表头插 单链表尾删 单链表头删 单链表查找 单链表在pos位置之前插入数据x ​编…

【QT】QT事件Event大全

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT中的事件Event技术,主要从QT事件流程和常用QT事件方法等方面展开,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易…

长假,GPT来敲(Jué)门(Fén)

引 马上十一了,本拐在干了XX和XX事情以后,开始划水,欢天喜地的等放假。 然后,GPT4说更新了,据说加了一个读图的功能,本拐不以为然,不就是什么文生图,图生文么,TOOOLD。 不…

QT按钮介绍

目录 按钮基类 QAbstractButton QPushButton QToolButton QRadioButton QCheckBox 按钮基类 QAbstractButton 这是按钮的基类,它是继承QWidget类 它可对当前的图标,标题等进行设置。 它有自己的一些信号与槽函数: /* 当按钮被激活时(即…

HBase高阶(一)基础架构及存储原理

一、HBase介绍 简介 HBase是Hadoop生态系统中的一个分布式、面向列的开源数据库,具有高可伸缩性、高性能和强大的数据处理能力。广泛应用于处理大规模数据集。 HBase是一种稀疏的、分布式、持久的多维排序map 稀疏:对比关系型数据库和非关系型数据库&a…

正则表达式的应用(前端写法)

文章目录 1、匹配字符串中,a标签的href值2、校验邮箱3、校验手机号码3、待添加... 1、匹配字符串中,a标签的href值 (1) 代码 /*** description 匹配字符串中,a标签的href值* param {string} str 匹配的字符串* return {Array} 返回href值*/…

【接口测试】HTTP协议

一、HTTP 协议基础 HTTP 简介 HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通常是由客户端发起一个请求,创建一个到服务器的 TCP 连接,当服务器监听到客户…

手机搜狗输入法,输入拼音时如何分割拼音,调出“分词“功能,如何微信或QQ使用发送按钮而不是换行?

背景 有时候打字,输入 “xian” 的时候我们的意图是 “xi’an” (西安),或者输入 “yue” 的时候希望是 “yu’e”(余额) 如何输入这个分隔符 ’ 呢? 设置方法 默认页面如图 希望设置成 点…

2023年【起重信号司索工(建筑特殊工种)】考试总结及起重信号司索工(建筑特殊工种)模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 起重信号司索工(建筑特殊工种)考试总结是安全生产模拟考试一点通生成的,起重信号司索工(建筑特殊工种)证模拟考试题库是根据起重信号司索工(建筑特殊工种)最新版教材汇编出起重信号司索工(建筑特殊工种)仿…

计算机网络 实验二 交换机的基本配置

实验二 交换机的基本配置 实验目的 • 掌握交换机的配置方式及切换命令; • 掌握交换机端口的基本配置; • 掌握交换机mac地址的查看与管理方法。 实验设备 以太网交换机一台服务器一台PC机五台配置电缆、网线若干 网络拓扑及IP地址分配 给计算…

腾讯云16核CPU服务器配置大全,CVM和轻量服务器

腾讯云16核CPU服务器有哪些配置可以选择?可以选择标准型S6、标准型SA3、计算型C6或标准型S5等,目前标准型S5云服务器有优惠活动,性价比高,计算型C6云服务器16核性能更高,轻量16核32G28M带宽优惠价3468元15个月&#xf…

OpenCV 实现 SIFT→SURF 算法关键点检测实现

目录 1,SIFT算法原理 1.1,基本流程 1.1.1 尺度空间极值检测 1.1.2 关键点定位 1.1.3 关键点方向确定 1.1.4 关键点描述 1.1.5 总结 1.2 SURF原理 2 代码实现 3 结果展示 4,你肯定会遇到报错 cv2.error: OpenCV(3.4.8) C…