【redis】五种数据类型和编码方式

news2025/4/21 22:05:08

文章目录

  • 五种数据类型
  • 编码方式
    • string
    • hash
    • list
    • set
    • zset
    • 查询内部编码

五种数据类型

image.png

  • 字符串:Java 中的 String
  • 哈希:Java 中的 HashMap
  • 列表:Java 中的 List
  • 集合:Java 中的 Set
  • 有序集合:除了存 member 之外,还有权重 score(权重、分数)

Redis 底层在实现上述数据结构的时候,会在源码层面,针对上述实现进行特定优化,来达到节省时间/节省空间的效果

  • 内部具体实现的数据结构还会有变化
  • Redis 向你承诺,现在我有个 hash 表,你进行查询、插入、删除操作,都保证时间复杂度是 O ( 1 ) O(1) O(1)
  • 但是,这个背后的实现,不一定就是一个标准的 hash 表,可能在特定的场景下,使用别的数据结构实现,但是仍然保证时间复杂度符合承诺

编码方式

  • 数据结构:Redis 承诺给你的,也可以理解成数据类型
  • 编码方式:Redis 内部底层的实现
    同一个数据类型,背后可能的编码实现方式是不同的,会根据特定场景优化

string

  • stringRedis 会自动适应,程序员在使用 Redis 的时候一般感知不到
    • raw:最基本的字符串。底层就是持有 byte 数组
    • intRedis 通常也可以用来实现“计数”这样的功能(帖子的点赞数,评论数…)。当 value 就是一个整数的时候,此时可能 Redis 直接使用 int 来保存
    • embstr:针对短字符串进行的特殊优化

hash

  • hash
    • hashtable:最基本的哈希表(这里是 Redis 内部的哈希表的实现,和 Java 标准库中的 HashTable 不一样)
    • ziplist:压缩列表,针对一些特殊的场景下,将数据进一步压缩,从而减少空间(在哈希表里面的元素较少的时候,可能就优化成 ziplist 了)

[!quote] 为什么要压缩?为什么是元素少的时候才压缩?

  • Redis 上有很多 key,可能某些 keyvaluehash。此时,如果 key 特别多,对应的 hash 也特别多,但是每个 hash 又不大的情况下,就尽量去压缩,压缩之后就可以让整体占用的内存更小了
  • 压缩是一种优化措施,但在大量数据的情况下,压缩和解压会增加额外的计算开销。元素较多时,Redis 通常会自动将存储方式从 ziplist 转为 hashtable 等更高效的存储方式,以避免在大量数据操作时发生性能瓶颈。

list

  • list
    • linkedlist:链表:非常方便从中间位置查找删除
    • ziplist:压缩列表(和 hash 里面的一样)
  • Redis 3.2 开始,引入了新的实现方式:quicklist。其同时兼顾了 linkedlistziplist 的优点。
  • quicklist 就是一个链表,每个元素又是一个 ziplist

set

  • set
    • hashtable
    • intset:集合中存的都是整数,就会被优化成 intset

zset

  • zset
    • skiplist跳表,其也是链表,只是不同于普通的链表。每个节点上有多个指针域,巧妙地搭配这些指针域的指向,就可以做到从跳表上查询元素的复杂度是 O ( l o g N ) O(logN) O(logN)(类似于平衡二叉搜索树(如 AVL 树、红黑树))
    • ziplist

查询内部编码

语法:

object encoding 

image.png|348

Redis 会自动根据当前的事迹情况选择内部的编码方式,自动适应。那我们是否要记住,什么时候使用什么编码方式呢?

  • 只记思想,不记数字!

网上的说法:如果字符串长度小于 39 字节,使用 embstr,超过 39 字节,使用 raw

  • 记数字,没有任何意义
  • 数字都是可配置的
  • 数字是怎么来的?需要考证清楚
  • 相比于知道数字,更重要的是知道数字是怎么得到的,就可以根据所处的实际场景,重新得到这样的数字

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

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

相关文章

色板在数据可视化中的创新应用

色板在数据可视化中的创新应用:基于色彩感知理论的优化实践 引言 在数据可视化领域,色彩编码系统的设计已成为决定信息传递效能的核心要素。根据《Nature》期刊2024年发布的视觉认知研究,人类大脑对色彩的识别速度比形状快40%,色…

【无人机路径规划】基于麻雀搜索算法(SSA)的无人机路径规划(Matlab)

效果一览 代码获取私信博主基于麻雀搜索算法(SSA)的无人机路径规划(Matlab) 一、算法背景与核心思想 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种受麻雀群体觅食行为启发的元启发式算法&#xff0…

STM32_GPIO系统外设学习

按照STM32MCUWIKI、参考手册的外设介绍----->CubeF4的软件包中相关的Exmple代码----->CubeMX设置截图加深理解记忆 资料链接:嵌入式开发_硬软件的环境搭建 我的飞书文档-GPIO篇 如果觉得内容不错,欢迎给我的飞书文档点赞。同时如果有什么意见或…

【操作系统安全】任务1:操作系统部署

目录 一、VMware Workstation Pro 17 部署 二、VMware Workstation 联网方式 三、VMware 虚拟机安装流程 四、操作系统介绍 五、Kali 操作系统安装 六、Windows 系统安装 七、Windows 系统网络配置 八、Linux 网络配置 CSDN 原创主页:不羁https://blog.csd…

下载安装启动 VMware 个人免费版本

一、进入官网并登录账号下载软件 进入官网 [ https://www.vmware.com ],点击Products,将页面划到最底下,点击 “SEE DESKTOP HYPERVISORS”按钮。 然后点击 Desktop hypevisor ,会出现如下界面,可以根据自己的操作系…

C#+AForge 实现视频录制

C#AForge 实现视频录制 ​ 在C#中,使用AForge 库实现视频录制功能是一个比较直接的过程。AForge 是一个开源的.NET框架,提供了许多用于处理图像和视频的类库。 开发步骤 安装AForge库 ​ 首先,确保你的项目中已经安装了 AForge.Video和AFo…

SAP SD学习笔记31 - 销售BOM

上一篇讲 前受金处理(预付款处理)。 SAP SD学习笔记29 - 前受金处理(预收款处理)_fplt 付款申请与sd 数据表的关联关系-CSDN博客 本章继续讲SAP SD模块的其他知识:销售BOM。 销售BOM在现场还是会用到的。 目录 1,销售BOM概要 2,受注BOM的…

大数据学习(63)- Zookeeper详解

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦🤞 &#x1f…

嵌入式八股C语言---面向对象篇

面向对象与面向过程 面向过程 就是把整个业务逻辑分成多个步骤,每步或每一个功能都可以使用一个函数来实现面向对象 对象是类的实例化,此时一个类就内部有属性和相应的方法 封装 在C语言里实现封装就是实现一个结构体,里面包括的成员变量和函数指针,然后在构造函数中,为结构体…

C# ListView设置标题头背景颜色和字体颜色

一、向ListView 添加数据 for (int i 1; i < 5; i) {ListViewItem litem new ListViewItem("data:"i);lv_WarnList.Items.Add(litem); }如果需要在ListView中绑定实体类对象的话&#xff0c;需要将数据放在Tag属性里 for (int i 1; i < 5; i) {AngleData …

嵌入式 ARM Linux 系统构成(6):应用层(Application Layer)

目录 一、应用层概述 二、应用层的核心组成 2.1 主应用程序&#xff08;Main Applications&#xff09; 2.2 系统服务&#xff08;System Services&#xff09; 2.3 用户界面&#xff08;User Interface&#xff09; 2.4 脚本与自动化工具 2.5 第三方库与框架 2.6 通信…

【HTML】一、基础标签

文章目录 1、开发环境准备2、html介绍3、html基本骨架4、标签的关系5、常用标签5.1 标题5.2 段落5.3 换行与水平线5.4 文本格式化标签5.5 图像标签5.6 超链接标签5.7 音频标签5.8 视频标签 6、路径7、网页制作 1、开发环境准备 在编辑器中写代码&#xff0c;在浏览器中看效果 …

centos7通过yum安装redis

centos7通过yum安装redis 1.安装redis数据库 yum install -y redis2.启动redis服务 systemctl start redis3.查看redis状态 systemctl status redis4、停止服务 systemctl stop redis5、重启服务 systemctl restart redis6、查看redis进程 ps -ef | grep redis7、开放端…

AutoMQ x OSS 的 Iceberg 数据入湖的最佳实践

背景 在数字化转型进程中&#xff0c;用户交互行为产生的多维度数据已成为企业的重要战略资产。以短视频平台为例&#xff0c;基于用户点赞事件的实时推荐算法能显著提升用户活跃度和平台粘性。这类实时数据主要通过 Apache Kafka 流处理平台进行传输&#xff0c;通过其扇出&a…

【Help Manual】导出PDF中英文不在一行解决方案

在使用Help Manual 的时候&#xff0c;会出现导出PDF时&#xff0c;中英文在同一行出现水平不对齐的问题。如下&#xff1a; 解决方案&#xff1a; 结果如下&#xff1a;

Scala编程_实现Rational的基本操作

在Scala中实现一个简单的有理数&#xff08;Rational&#xff09;类&#xff0c;并对其进行加法、比较等基本操作. 有理数的定义 有理数是可以表示为两个整数的比值的数&#xff0c;通常形式为 n / d&#xff0c;其中 n 是分子&#xff0c;d 是分母。为了确保我们的有理数始终…

用python和Pygame库实现“跳过障碍”游戏

用python和Pygame库实现“跳过障碍”游戏 游戏开发 跳过障碍游戏流程说明&#xff1a; 启动游戏后显示开始界面&#xff08;包含游戏说明&#xff09; 按空格键进入游戏 游戏过程中躲避障碍物获取分数 碰撞后显示结束界面&#xff08;包含最终得分&#xff09; 按空格键…

SqlServer数据库报错紧急或可疑无法访问的修复过程,亲测有效。

当 SQL Server 数据库被标记为 SUSPECT 状态时&#xff0c;表示数据库可能由于事务日志损坏、数据文件丢失或其他严重问题而无法正常启动。以下是一个详细的恢复步骤&#xff0c;基于搜索结果中的信息和常见的最佳实践&#xff1a; 恢复步骤 1. 确认数据库状态 将database-n…

【python-uiautomator2】手机上的ATX应用界面报错问题处理:无法提供服务,非am instrument启动

目录 一、前期准备 1.1 插入设备 1.2 安装atx-agent 二、解决报错&#xff1a;无法提供服务&#xff0c;非am instrument启动 2.1 出现报错 2.2 尝试解决 2.3 最终解决 三、开启ATX的悬浮窗权限 一、前期准备 1.1 插入设备 本地插入待执行设备&#xff0c;待执行设备…

子母钟系统,京准电子科技助力高考精准计时

子母钟系统&#xff0c;京准电子科技助力高考精准计时 子母钟系统&#xff0c;京准电子科技助力高考精准计时 【摘要】子母钟系统又叫网络时钟系统是校园网络中一个重要的精准计时系统&#xff0c;随着网络的普及&#xff0c;许多校园都建了自己的校园专网&#xff0c;使用的…