Redis常用数据类型及其对应的底层数据结构

article/2025/8/29 2:23:22

Redis数据库

Redis是一种键值(Key-Value)数据库。相较于MySQL之类的关系型数据库,Redis是一种非关系型数据库。Redis存储的数据只包含两部分,只能通过来查询。这样简单的存储结构,能让Redis的读写效率非常高(HashMap读写效率都是O(1))。

除此之外,Redis主要作为内存型数据库来使用。也即是说,Redis的数据存储在内存中。尽管如此,它也支持通过持久化机制将内存中的数据保存在硬盘中。

作为一种键值数据库,Redis键的数据类型一般是字符串,值的类型则有很多中,包括字符串(String)、列表(List)、字典(Hash)、集合(Set)、有序集合(Ordered Set)。

字符串(String)

字符串即普通的字符串,单个char组成的集合。

列表(List)

Redis的列表有两种实现方法,一种是压缩列表(ziplist),另一种是双向循环链表

当列表需要存储的数据量比较小的时候,就可以采用压缩列表的方式实现,具体需要满足如下两个条件:

  • 列表中保存的单个数据(字符串或其他)小于64字节
  • 列表中数据个数小于512个。
压缩列表

压缩列表可以看做是特殊的数组,它也是通过一片连续的存储空间来存储数据的。但与数组要求每个元素占据的空间大小一致不同,压缩列表允许存储的单个元素大小不同。
在这里插入图片描述
存储格式:[data_num][data1_len][data1][data2_len][data_2][...]
data_num表示了压缩列表存储的数据数目,datai_len代表第i个数据项的长度,datai则表示具体存储的数据。因为允许每个数据大小不同,所以不可避免的需要知晓每个元素的大小,这是为什么要存储每个数据的长度。

而如果我们严格按照数组的要求,每个数据的大小相同,那么我们不需要存储每个数据的长度,但这样会造成空间的浪费,如下图:
在这里插入图片描述
压缩列表这样存储结构,一方面节省内存,一方面允许不同类型的数据的存储,比数组灵活。因为数据仍然存储在一片连续的内存空间中,仍然按照键来获取数据,因此仍然和数据一样具有随机存取的特性。

当数据存储量比较大的时候,即上述两个条件未得到满足,那么Redis使用双向循环链表来实现List

// Redis 采用C语言实现
typedef struct ListNode {struct ListNode *prev;struct ListNode *next;void *value;
}typedef struct List {ListNode *head;ListNode *tail;unsigned long len;//...
} List

字典(hash)

字典类型用来存储一组数据对,每组数据对包含键值两部分。字典类型也对应两种实现方式,一种是压缩列表,另一种是散列表

类似于List,当字典需要存储的数量量比较小的情况下,Redis采用压缩列表来实现。具体而言,和List的条件大致相当:

  • 字典中保存的键和值的大小都小于64字节。
  • 字典中的键值对数目小于512。

不能满足上述条件,即存储的数据量较大时,采用散列表来实现字典类型。

Redis实现字典的散列表采用MurmuerHash2哈希算法实现,该哈希算法有运行速度快、随机性好的特点。Redis采用链表法来解决哈希冲突。除此之外,Redis支持动态扩容、缩容。装载因子小于0.1时,会出发缩容,缩小为字典中数据个数的大约两倍;而当装载因子大于1时,会触发扩容,扩大为原来的两倍左右。扩容缩容的比例都是两倍,具体见源码

扩容缩容要做大量的数据搬移和哈希值重新计算工作,因此较耗时。Redis采用渐进式扩容缩容策略,即将扩容操作穿插在插入操作的过程中,分批完成,缩容类似。这样将其均摊时间复杂度维持在O(1),同时避免大量数据一次性搬移导致的服务停顿。

集合(Set)

集合用来存储一组不重复的数据。Redis中集合也对应两种实现方法,一种是基于有序数组,另一种是基于散列表。

集合需要存储数据量比较小的时候,Redis采用有序数组来实现,具体条件如下:

  • 存储的数据都是整数。
  • 存储的数据元素不超过512。

不能满足上述条件,即存储的数据量较大时,Redis就采用散列表来存储集合中的数据。

有序集合(Ordered Set)

有序集合大多基于跳表实现(如MySQL的有序集合)。它用存储一组数据,并且每个数据附带一个得分(可以是直接的大小),通过得分的大小,将数据组织成跳表这样的数据结构。

当存储的数据量较小时,Redis采用压缩列表来实现有序集合,条件如下:

  • 所有的数据大小都小于64字节。
  • 元素个数小于128。

不满足上述条件,即存储的数据量较大时,Redis就采用跳表来实现有序集合。

数据持久化

Redis虽然被当做内存数据库来使用,但遇到服务器崩溃、机器断电等极端情况时,为了快速从故障中恢复,也提供了持久化机制,具体参见Redis专题。

这里我们谈一谈实现层面。

持久化机制有两种实现思路:

  1. 清除原有存储结构,只将数据存储到磁盘中。
  2. 保留原来的存储格式,按原格式存储到磁盘中。

第一种方式有明显的弊端,即从硬盘还原到内存中,还需要恢复原有的数据结构(以哈希表为例,需要重新计算哈希值),数据量非常大时,这种操作的耗时不可小觑。但Redis作为内存型数据中,一般而言存储的数据规模不会很大。

第二种方式也并非完美,按原有存储格式需要占用更多的存储空间。Redis在持久化机制的实现上,可能是每秒落盘一次或者每次操作都落盘一次,空间问题也需要考虑。

Redis选择的是第一种实现方案。

总结

Redis常用数据结构:

  • String
  • List
  • Hash
  • Set
  • Ordered Set

Redis实现这些数据结构使用的底层数据结构:

  • 压缩列表
  • 有序数组
  • 链表
  • 散列表
  • 跳表

在数据量比较小的情况下,采用不同的数据结构来实现,主要是出于时间和空间的考虑。数组能实现随机存取,压缩列表作为特殊的数组保留了这一特性。

但当数据量比较大时,由于数组要占用连续的存储空间,可能就不太好实现了,因为转换到了链表,同时为了保证速度采用了散列表。

参考

数据结构与算法之美


http://chatgpt.dhexx.cn/article/QxAZRZY3.shtml

相关文章

二. Redis 数据类型

2.1 Redis 字符串 (String) 2.1.1 概述 String 是 Redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。 String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。 …

Redis数据类型Hash

文章目录 Hash类型介绍hash 类型数据的基本操作 hash 类型数据操作的注意事项Hash和String类型的区别 有时候我们往往不是在缓存中存一个值,而是选择存一个对象,比如一个购物车消息,我们就需要使用到hash了 Hash类型介绍 新的存储需求&…

Redis数据类型String

文章目录 数据存储类型介绍String类型String类型的基本操作String单数据操作和多数据操作的选择问题string 类型数据的扩展操作数据增加指定范围的值String 设置数据指定的生命周期string 类型数据操作的注意事项 数据存储类型介绍 常用的五个数据类型: string --------------…

Redis数据类型 - 散列(Map)

文章目录 一、散列简介二、散列的基本操作三、散列与字符串比较1、散列键的优点2、字符串键的优点 一、散列简介 散列就是hash或者说Map,Redis的散列键会将一个键和一个散列在数据库中关联起来,可以在散列中设置任意多个字符串键值对,因此通…

redis数据类型插入输出命令

进入客户机:redis-cli 中文字符不能显示:redis-cli --raw、get Course:1:Cname 一、redis数据类型数据的添加 1、String 添加数据:set StringTest(数据名称) “helloword”(数据) 显示数据:get StringTest(数据名称&am…

Redis数据类型及使用场景

转自: http://www.kubiji.cn/juhe-id7106.html Redis数据类型及使用场景 来源: WQTech阅读: 2936 时间:2 小时前 摘要:Redis相比其它的KV数据库,其一大特点是支持丰富的数据类型.它一共支持5种数据类型,下面逐一介绍这…

Redis数据类型与操作命令

1. 键值对数据库 1.1 redis数据结构 redis的数据是 key-value 形式的键值对,其中 key 其实都是字符串的形式,而 value 的数据类型,也就是数据的保存形式,底层实现的方式就用到了数据结构。 所以我们一直说的“redis五种数据结构…

Redis数据类型

文章目录 STRINGLISTSETHASHZSET Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求,Redis各数据类型的使用场景可以参考Redis使用场景 数据类型可以存储的值操作ST…

redis数据类型(5种)和底层实现

redis数据类型(5种)和底层实现 Redis的特点 要用好Redis,首先要明白它的特点: 读写速度快。redis官网测试读写能到10万左右每秒。速度快的原因这里简单说一下,第一是因为数据存储在内存中,我们知道机器访问内存的速度是远远大于…

Redis数据类型及编码

Redis数据类型及编码 说到Redis的数据类型,我们大概会很快想到Redis的5种常见的数据类型:字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted Set),以及他们的特点和运用场景及常用命令。不过在讲五大数据类型之前&#x…

Redis 基础 -- Redis数据类型之set

文章目录 1. Redis数据类型之set1.1 set类型介绍1.2 set类型基本操作1.3 set 类型数据的扩展操作:获取随机的数据1.4 set 类型数据的扩展操作:集合的交、并、差集1.4.1 sinter命令1.4.2 sunion命令1.4.3 sdiff命令1.4.4 sinterstore命令1.4.5 sunionstor…

Redis 数据类型

1、string类型 (1)存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型。 string,他就是存一个字符串儿,注意是value那一部分是一个字符串,它是redis中最基本、最…

NoSQL数据库之Redis(三):常用五大数据类型

目录 Redis键(key)常用命令 Redis字符串(String)常用命令原子性数据结构 Redis列表(List)常用命令数据结构 Redis集合(Set)常用命令数据结构 Redis哈希(Hash)常用命令数据结构 Redis有序集合Zset(sorted set)常用命令数据结构跳跃表(跳表) redis常见数据…

redis的五种数据类型

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。 🏆本文收录于,Java基础教程系列,目前已经700+订阅,CSDN最强Java专栏,包含全部Java基础知识点、Java8新特性、…

Redis 的五种基本数据类型

一、String 类型 1.1 介绍 String 类型,也就是字符串类型,是 Redis 中最简单的存储类型。其 value 是字符串,不过根据字符串的格式不同,又可以分为 3 类: string:普通字符串int:整数类型&…

【Redis学习】Redis10大数据类型

总体概述 这里说的数据类型是value的数据类型,key的类型都是字符串。 redis字符串(String) string是redis最基本的类型,一个key对应一个Tvalue。 string类型是二进制安全的,意思是redis的string可以包含任何数据&am…

【Redis7学习日记】—— Redis十大数据类型

一、十大类型概述 首先,我们要知道此处的数据类型指的是 value 的类型,Redis 的 key 都是字符串类型我们通过一张图,先大致了解一下这些数据结构的样子 1.1 String 类型 String 是 Redis 中最基本的数据类型,一个 key 对应一个…

Redis的8种数据类型

目录 一、概述 1、redis是什么 2、redis能干嘛 3、redis常识 3.1、基本命令 3.2、为什么redis是单线程 二、五大数据类型 1、String 2、List列表 3、Set 4、Hash 5、Zset有序集合 三、三种特殊数据类型 1、geospatial地理位置 2、hyperloglog 3、bitmaps 一、概述…

Redis五种基本数据类型

五种基本数据类型 redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型 主要包括常见的5种数据类型,分别是:String、List、Set、…

离散数学课后习题答案 左孝凌版

离散数学课后习题答案(左孝凌版) ,部分截图如下 太多了,就不在一一复制,可以扫描最上面的二维码,关注微信公众“数据结构和算法”,回复离散数学的拼音简称lssx即可获得下载地址