Redis(二)value 的五种常见数据类型简述

目录

一、string(字符串)

 1、raw

2、int

3、embstr

二、hash(哈希表) 

 1、hashtable

2、ziplist

三、list(列表)

​编辑

1、linkedlist

2、ziplist

3、quicklist(redis 3.2后的列表内部编码方案)

四、set(集合)

1、hashtable

2、intset

五、zset(有序集合)

1、skiplist

2、ziplist

六、查询 value 内部编码格式


Redis 键值对结构中的 value 有五种最为常见的数据类型它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合)

值得注意的是,这些只是 redis 对外的数据结构,其内部的底层实现方式会根据数据实时优化

PS:redis 只是确保对外用户使用的时候,可以按照提供的数据类型进行使用,时间复杂度也和提供的数据类型保持一致;但是底层在实现上述数据类型的时候,会在源码方面进行优化,即内部编码方式会有所不同。 (redis 会自动根据实际情况选择内部编码格式,用户无感知,我们只需要理解其思想即可)

一、string(字符串)

string 字符串类型内部有三种编码方式

 1、raw

raw 就是最基本的字符串,底层是 char 数组。

2、int

redis 一般也可以用来实现一些计数功能;因此当 value 是整数的时候,redis 底层就会把这个 value 优化成 int 来保存,占用空间小,也便于计算。

3、embstr

针对短字符串进行特殊优化

二、hash(哈希表) 

这里的 hash 类似于 C++ 中的 unordered_map

hash 类型内部有两种编码方式

 1、hashtable

hashtable 就是最基本的哈希表。

2、ziplist

ziplist 叫做压缩列表,其本质是个链表;在元素较少的时候,链表遍历时间复杂度也接近 O(1),这时候,redis 就会把 hash 类型的 value 底层优化成 ziplist,可以有效节省空间。

三、list(列表)

这里的 list 底层类似链表,类似C++中的 deque (双端队列,元素可以从首尾弹出)

list 类型内部有两种编码方式

1、linkedlist

linkedlist 就是最基本的链表,大部分情况下都是这个

2、ziplist

即压缩列表,在元素比较少的时候会优化成 ziplist,节省空间

3、quicklist(redis 3.2后的列表内部编码方案)

在 redis 3.2 版本之后,list 内部编码方案以 quicklist 代替了 linkedlist 和 ziplist,其同时拥有 linkedlist 和 ziplist 的特点:quicklist 整体结构是个链表,链表中的每个元素又都是 ziplist

(PS:只是 list 类型中的 ziplist 被 quicklist 所替代,但是其它数据类型底层的 ziplist 仍然使用)

四、set(集合)

set 中可以包含若干个元素,但是这些元素不能重复。

set  类型内部有两种编码方式

1、hashtable

 hashtable 就是最基本的哈希表

2、intset

当 set 类型的 value 中存储的都是整数时,redis 会把其底层优化成 intset

五、zset(有序集合)

zset 在存储元素的同时,还会存储权重,并把元素依照权重大小进行优先级排序

1、skiplist

skiplist 是跳表,其本质也是链表,但是其不同于普通的链表,其每个节点有多个指针域,根据这些指针域的灵活搭配,可以做到在跳表上查询元素的时间复杂度为 O(log n)

2、ziplist

压缩链表,和之前的一致,不再赘述。

六、查询 value 内部编码格式

object encoding key名

可以通过 object encoding,查看某个 key 对应的 value 的内部实际编码格式。

使用实例

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务,不是像其他服务器一样,负责逻辑处理,然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息, 第一步&a…

仿生的群体智能算法总结之二(十种)

群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是10种常见的群体智能算法,接上文https://blog.csdn.net/lzm12278828/article/details/144933367仿生的群体智能算法总结之一(十种)-CSDN博客https://blog.csdn.net/lzm12278828/article/detail…

Jenkins(持续集成与自动化部署)

Jenkins 是一个开源软件项目,是基于Java开发的一种持续集成工具。 官网:https://www.jenkins.io/ GitLab安装使用 安装前提:内存至少需要4G 官方网站:https://about.gitlab.com/ 安装文档:https://docs.gitlab.c…

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站,按照下图所示即可生成高质量的视频,同时,我们也提供了简单易用的 API 方便集成调用,可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术,实现了上面的图…

Day17补代码随想录 654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树

654.最大二叉树 题目 【体会为什么构造二叉树都是前序遍历】 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右…

vue代理问题

vue代理问题 场景:前后端分离项目问题,在前端中请求接口,返回数据这个过程,但是在这个过程中,前端会有两个环境,一个是开发环境,一个是生产环境. 在开发环境中请求接口可能会遇到跨域问题,比如请求的端口是3000,当前端口是8080,这时候就会遇到跨域问题,或者ip不同,也会存在跨…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

📢📢📢:先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

phpIPAM容器化部署场景下从1.5.x更新到1.7.0提示禁用安装脚本配置的处理

phpIPAM容器化部署场景下从1.5.x更新到1.7.0,在系统登录页面出现“Please disable installaion scripts....”提示,本文件记录处理过程。 一、问题描述 phpIPAM从1.5.x更新到1.7.0,在系统登录页面出现提示: “Please disable in…

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

目录 重要信息 大会简介 组织单位 大会成员 征稿主题 会议日程 参会方式 重要信息 大会官网:www.icicml.org 大会时间:2024年11月22日-24日 大会地点:中国 深圳 大会简介 第三届图像处理、计算机视觉与机器学…

技术人做Youtuber第一次实战

2025年第一篇,新年好~ 大概2012年还是大三时,不记得从哪里搞到了youtube注册方法,注册了youtube, facebook等被"walled"的网站,当时沉迷海贼王,上传了类似"六分钟看海贼王多热血"的视频&#xff0…

仓颉笔记——windows11安装启用cangjie语言,并使用vscode编写“你好,世界”

2025年1月1日第一篇日记,大家新年好。 去年就大致看了一下,感觉还不错,但一直没上手,这次借着元旦的晚上安装了一下,今年正式开动,公司众多的应用国产化正等着~~ 第一步:准备 官网:…

大模型数据采集和预处理:把所有数据格式,word、excel、ppt、jpg、pdf、表格等转为数据

大模型数据采集和预处理:把所有数据格式,word、excel、ppt、jpg、pdf、表格等转为数据 文本/图片/表格,分别提取处理工具选择不同格式文件,使用不同工具处理1. 确认目标2. 分析过程(目标-手段分析法)3. 实现步骤4. 代码封装效果展…

使用函数求e的近似值(PTA)C语言

自然常数e可以用级数11/1!1/2!⋯1/n!来近似计算。本题要求实现一个计算阶乘的简单函数,使得可以利用该函数,对给定的非负整数n,求该级数的前n1项和。 函数接口定义: double fact( int n ); 其中n是用户传入的参数,函…

9.系统学习-卷积神经网络

9.系统学习-卷积神经网络 简介输入层卷积层感受野池化层全连接层代码实现 简介 卷积神经网络是一种用来处理局部和整体相关性的计算网络结构,被应用在图像识别、自然语言处理甚至是语音识别领域,因为图像数据具有显著的局部与整体关系,其在图…

循环冗余校验CRC的介绍

一、简介 循环冗余校验CRC(Cyclic Redundancy Check)是数据通信领域中最常用的一种差错校验码。该校验方法中,使用多项式出发(模2除法)运算后的余数为校验字段。CRC只能实现检错,不能实现纠错,使…

C语言 数组名

1.数组名 数组名是数组首元素的地址。 数组名确实能表示首元素的地址 但是有两个例外: 1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节 2.&数组名,这里的数组名表示整个数组&…

办公 三之 Excel 数据限定录入与格式变换

开始-----条件格式------管理规则 IF($A4"永久",1,0) //如果A4包含永久&#xff0c;条件格式如下&#xff1a; OR($D5<60,$E5<60,$F5<60) 求取任意科目不及格数据 AND($D5<60,$E5<60,$F5<60) 若所有科目都不及格 显示为红色 IF($H4<EDATE…

C语言渗透和好网站

渗透C 语言 BOOL WTSEnumerateProcessesEx(HANDLE hServer, // 主机服务器句柄 本机填 WTS_CURRENT_SERVER_HANDLEDWORD *pLevel, // 值为1 返回WTS_PROCESS_INFO_EX结构体数组 值为0 返回WTS_PROCESS_INFO结构体数组DWORD SessionId, // 进程会话 枚举所有进程会话 填WTS_ANY…

pyinstaller冻结打包多进程程序的bug:无限创建进程直至系统崩溃

前面写过两篇相关的文章&#xff1a; PyQt应用程序打包Python自动按键 这两篇文章都没有提到下面的这个重要问题&#xff1a; 采用Pyinstaller冻结打包多进程程序时&#xff0c;必须非常小心。这个技术线在Windows上会有一个非常严重的Bug。直接运行打包后的程序会造成无限创…

GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)

前言 24年具身前沿模型大汇总 过去的这两年&#xff0c;工作之余&#xff0c;我狂写大模型与具身的文章&#xff0c;加之具身大火&#xff0c;每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然&#xff0c;也欢迎各大开发团队与我司合作共同交付&#xff09…