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

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 的内部实际编码格式。

使用实例
http://www.lryc.cn/news/516158.html

相关文章:

  • Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决
  • 【网页自动化】篡改猴入门教程
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 4:MHE表示能力
  • Github - unexpected disconnect while reading sideband packet
  • Ubuntu 环境安装 之 RabbitMQ 快速入手
  • UE5中实现右键开镜效果
  • Apache HTTPD 换行解析漏洞(CVE-2017-15715)
  • Excel重新踩坑5:二级下拉列表制作;★数据透视表;
  • 力扣--35.搜索插入位置
  • C# 设计模式(行为型模式):模板方法模式
  • Leetcode打卡:设计一个ATM机器
  • 【TCP】SYN、ACK、FIN、RST、PSH、URG的全称
  • 【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析
  • 【通识安全】应急救护常识23则
  • C语言:cJSON将struct结构体与JSON互相转换
  • 在Linux中,如何查看和修改网络接口配置?
  • 使用深度学习来实现图像超分辨率 综述!
  • 基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划
  • 【Android项目学习】3. MVVMHabit
  • 在Linux中,如何配置负载均衡器以分配网络流量?
  • 手机投屏到电视的3种选择:无线本地投屏,无线远程投屏,AirPlay投屏
  • MySQL关联关系理论与实践
  • 多模态论文笔记——U-ViT(国内版DiT)
  • 在 IntelliJ IDEA 中开发 GPT 自动补全插件
  • 7. C语言 运算符详解
  • Java四大常用JSON解析性能对比:Hutool、Fastjson2、Gson与Jackson测试
  • Qt 5.14.2 学习记录 —— 일 新项目
  • uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器
  • Unity3D仿星露谷物语开发17之空库存栏UI
  • QT------模型/视图