首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

REDIS 数据结构与对象

前言 Redis 是一种非关系类型数据库,(k, v)形式储存数据信息。由于读写速度很快,常被应用于缓存方向。Redis 使用对象来代表数据库键和。...其 key 形式都是使用字符串形式,value 形式可以是上面五种对象任意一种。Redis 对象内存结构如图1所示: 这里 type 代表对象种类。...根据编码形式不同,分为 int 编码,raw 编码以及 embstr 三种编码形式。 1.1 int编码 当 Redis 对象储存整数值时,其使用便是 int 编码。...但是实现字符串对象数据结构时,并没有使用简单字符串数据结构形式。而是使用 SDS 结构进行储存。...数组,数组中储存 key 以及 value ,但是我们存入时并不是简单将 key 存入对应位置。

16520
您找到你想要的搜索结果了吗?
是的
没有找到

Redis 底层数据结构概述(v6.2)

1.3.1 获取字符串长度时间复杂度为 O(1) —— 效率 获取字符串长度效率,SDS 为 O(1), C 字符串为 O(n)。...和 C 字符串不同,SDS 数据结构,有专门用于保存字符串长度变量,可以通过获取 len 属性,直接知道字符串长度。...但是 Redis 不是靠空字符来判断字符串结束,而是通过 len 这个属性。那么,即便是中间出现了空字符对于 SDS 来说,读取该字符仍然是可以。...在数据结构,我们清楚 key 是唯一,但是我们存入里面的 key 并不是直接字符串,而是一个 hash ,通过 hash 算法,将字符串转换成对应 hash ,然后 dictEntry 中找到对应位置...3.2.5.3 数据转移 将 ht[0] 数据转移到 ht[1] 转移过程,需要对哈希表结点数据重新进行哈希计算。

37010

【深入解读Redis系列】(五)RedisString认知误区,详解String数据类型

具体String是如何保存数据呢 Redis String是一种简单键值对数据结构,它可以是字符串整数或浮点数。Redis,String类型数据是以字节数组形式进行存储。...具体来说,当我们向Redis存储一个String类型时,Redis会将这个二进制形式进行存储。...这样设计目的是为了提高字符串修改效率,避免频繁内存分配和释放操作 **。 Redis,String类型是以字节数组形式进行存储,所以「它可以存储任意类型数据」 。...这个对象ptr 字段指向实际SDS结构体,不是直接存储字符串内容。这样设计目的是为了支持不同编码方式字符串,比如int、float等。...需要注意是,压缩列表适用于存储较小列表和哈希表,当数据量较大时,性能可能会受到影响。 Redis ,当列表或哈希长度超过一定阈值时,会自动将压缩列表转换为普通链表或哈希表,提高性能。

31670

从零单排学Redis【青铜】

Java实现Map不是专业做缓存,JVM内存太大容易挂掉。一般用做于容器来存储临时数据,缓存数据随着JVM销毁结束。Map所存储数据结构,缓存过期机制等等是需要程序员自己手写。...为1006字符串对象为例 下面我就来说一下我们Redis常见数据类型:string、list、hash、set、sortset。它们底层数据结构究竟是怎么样!...SDS例子 2.1.1使用SDS好处 SDS与C字符串表示比较 sdshdr数据结构中用len属性记录了字符串长度。那么获取字符串长度时,时间复杂度只需要O(1)。...从代码上看:“字典”也是哈希表基础上再抽象了一层而已。 Redis,key-value数据结构底层就是哈希表来实现。对于哈希表来说,我们也并不陌生。...Java哈希表实际上就是数组+链表形式来构建。下面我们来看看Redis哈希表是怎么构建吧。

55620

数据结构与算法 | 哈希表(Hash Table)

哈希表(Hash Table)二分搜索中提到了在有序集合查询某个特定元素时候,通过折半方式进行搜索是一种很高效算法。那能否根据特征直接定位元素,而非折半去查找?...// 工程应用上值得注意是 Hashtable是线程安全HashMap不是 public HashMap records1 = new HashMap()...装载因子表示哈希表已用空间与总空间比例,需要适时进行动态调整保持哈希性能。// 示例java初始化 HashMap容量以及装载因子。...哈希表需要处理哈希冲突,确保不同键可以正确存储和检索。存储结构: 哈希表通常由一个数组和一个哈希函数组成。数组每个元素称为桶(Bucket),它可以存储一个或多个键-对。...如果存在哈希冲突,必须在冲突元素搜索找到正确键-对。删除(Deletion): 删除键-对时,使用相同哈希函数计算哈希码,然后从存储位置删除对应键-对。

587191

Redis 内部编码与优化方式

原始编码,将字符串字节数组形式存储 "raw" REDIS_ENCODING_INT 整数编码,将字符串转换为整数并以整数形式存储 "int" REDIS_ENCODING_HT 哈希表编码,用于表示哈希类型...字符串空字符’\0’结尾,buf 长度可以通过 sdslen获取,不包括结尾’\0’。 len:表示字符串长度,即不包括结尾’\0’字符个数。... Redis ,共享对象池用于管理和复用一些常用数据结构对象,减少内存碎片和提高性能。这些共享对象通常是一些常量字符串整数对象等,它们 Redis 内部会被频繁使用。...这意味着如果多个键存储相同字符串,它们实际上引用是同一个共享字符串对象,不是每个键都有一份独立拷贝。...整数对象池: Redis 为小整数(通常范围在[-10000, 10000])维护一个整数对象池。当存储整数值时,Redis 尽量使用已存在整数对象,不是创建新对象。

18010

【3y】从零单排学Redis【青铜】

Java实现Map不是专业做缓存,JVM内存太大容易挂掉。一般用做于容器来存储临时数据,缓存数据随着JVM销毁结束。Map所存储数据结构,缓存过期机制等等是需要程序员自己手写。...为1006字符串对象为例 下面我就来说一下我们Redis常见数据类型:string、list、hash、set、sortset。它们底层数据结构究竟是怎么样!...SDS例子 2.1.1使用SDS好处 SDS与C字符串表示比较 sdshdr数据结构中用len属性记录了字符串长度。那么获取字符串长度时,时间复杂度只需要O(1)。...从代码上看:“字典”也是哈希表基础上再抽象了一层而已。 Redis,key-value数据结构底层就是哈希表来实现。对于哈希表来说,我们也并不陌生。...Java哈希表实际上就是数组+链表形式来构建。下面我们来看看Redis哈希表是怎么构建吧。

53340

数据结构-hash表

什么是哈希哈希表(散列表)是根据关键码(Key value)直接进行访问数据结构。 也就是说,它通过把关键码映射到表中一个位置来访问记录, 加快查找速度。...给定表M,存在函数f(key),对任意给定关键字key, 代入函数后, 若能得到包含该关键字记录在表下标地址, 则称表M为哈希(Hash)表, 函数f(key)为哈希(Hash) 函数。...答案是会,但我们这个乘法不关心溢出,因为我们根本不是为了获取相乘结果,而是为了获取index。...这跟一个法则有关,叫黄金分割法则,描述黄金分割法则最经典表达式无疑就是著名斐波那契数列,即如此形式序列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,...适用范围 快速查找,删除基本数据结构,通常需要总数据量可以放入内存。 基本原理及要点 hash函数选择,针对字符串整数,排列,具体相应hash方法。

79910

Redis面试(三):底层数据结构(一)

O(1)复杂度长度获取:通过len字段,可以O(1)时间复杂度内获取字符串长度,而无需遍历整个字符串。二进制安全:SDS不仅可以存储文本字符串,还可以存储二进制数据。...压缩列表并不是对数据利用某种算法进行压缩,而是将数据按照一定规则编码一块连续内存区域,目的是节省内存。...优点压缩列表(ziplist)Redis具有以下几个优点:内存效率:压缩列表紧凑方式存储数据,可以相对较小内存空间中存储多个元素。...Redis可以不进行大规模内存重新分配和复制情况下,快速调整压缩列表大小适应新元素。灵活元素类型:压缩列表可以存储不同类型元素,包括整数字符串和字节数组等。...Redis支持三种编码类型:int16、int32和int64,分别用于存储16位、32位和64位整数。编码类型决定了整数集合存储形式和占用内存大小。

22460

Redis数据结构与底层实现揭秘

1.字符串底层实现:简单动态字符串(SDS) Redis字符串类型并不是直接使用C语言中原生字符串空字符\0结尾字符数组)进行存储,而是使用了一个称为简单动态字符串(Simple Dynamic...常数时间复杂度获取字符串长度:由于SDS结构内部维护了一个len字段来记录字符串的当前长度,获取字符串长度操作可以常数时间复杂度O(1)内完成,不需要像C语言原生字符串那样遍历整个字符串。...C语言原生字符串空字符作为结束标志,这限制了它们不能包含空字符。SDS则通过len字段来明确字符串长度,因此不受此限制。...由于它要求集合元素必须是整数,并且元素数量较少,因此处理非整数元素或大量元素时,整数集合可能不是最优选择。...字典是一种哈希表,它通过哈希函数将元素哈希映射到相应桶(bucket)支持快速查找、插入和删除操作。 字典优势在于: 灵活性高:字典可以存储任意类型元素,不仅仅是整数

45510

Python3.6.5标准库文档(完整中文版)---内置函数(七)

这总是当前模块字典(函数或方法内部,这是定义它模块,不是调用它模块)。 hasattr(object,name ) 参数是一个对象和一个字符串。...) hash(object ) 返回对象散列(如果有)。哈希整数。它们用于字典查找期间快速比较字典键。比较相等数值具有相同散列(即使它们具有不同类型,就像1和1.0一样)。...版本3.4进行了更改:更改pydoc并inspect意味着可报告已报告签名现在更加全面和一致 hex(x ) 将整数转换为“0x”为前缀小写十六进制字符串。...如果x不是Python int对象,则必须定义一个__index__()返回整数 方法。...255, 'X') ('0xff', 'ff', 'FF') >>> f'{255:#x}', f'{255:x}', f'{255:X}' ('0xff', 'ff', 'FF') 注意: 要获取浮点数十六进制字符串表示形式

45410

redis底层数据结构

2、简单动态字符串 第一篇文章我们就说过 Redis 是用 C 语言写,但是对于Redis字符串,却不是 C 语言中字符串(即空字符’\0’结尾字符数组),它是自己构建了一种名为 简单动态字符串...①、常数复杂度获取字符串长度 由于 len 属性存在,我们获取 SDS 字符串长度只需要读取 len 属性,时间复杂度为 O(1)。...④、二进制安全 因为C字符串空字符作为字符串结束标识,而对于一些二进制文件(如图片等),内容可能包括空字符串,因此C字符串无法正确存取;所有 SDS API 都是以处理二进制方式来处理 buf...③、删除:各个层中找到包含指定节点,然后将节点从链表删除即可,如果删除以后只剩下头尾两个节点,则删除这一层。...压缩列表原理:压缩列表并不是对数据利用某种算法进行压缩,而是将数据按照一定规则编码一块连续内存区域,目的是节省内存。

45630

Redis使用及源码剖析-8.Redis对象-2021-1-21

文章目录 前言 一、Redis对象模型 二、字符串对象 1、字符串对象编码形式 2、字符串对象编码转换 三、列表对象 1、列表对象编码形式 2、列表对象编码转换 四、哈希对象 1、哈希对象编码形式...在下面的示例, 我们通过 APPEND 命令, 向一个保存整数字符串对象追加了一个字符串, 因为追加操作只能对字符串执行, 所以程序会先将之前保存整数值 10086 转换为字符串 “10086...hashtable 编码哈希对象使用字典作为底层实现, 哈希对象每个键值对都使用一个字典键值对来保存:字典每个键都是一个字符串对象, 对象中保存了键值对键;字典每个都是一个字符串对象, 对象中保存了键值对...除此之外, zset 结构 dict 字典为有序集合创建了一个从成员到分值映射, 字典每个键值对都保存了一个集合元素: 字典键保存了元素成员, 字典则保存了元素分值。...Redis 会在初始化服务器时, 创建一万个字符串对象, 这些对象包含了从 0 到 9999 所有整数值, 当服务器需要用到为 0 到 9999 字符串对象时, 服务器就会使用这些共享对象, 不是新创建对象

53040

Redis详解(四)------ redis底层数据结构

2、简单动态字符串   第一篇文章我们就说过 Redis 是用 C 语言写,但是对于Redis字符串,却不是 C 语言中字符串(即空字符’\0’结尾字符数组),它是自己构建了一种名为 简单动态字符串...①、常数复杂度获取字符串长度   由于 len 属性存在,我们获取 SDS 字符串长度只需要读取 len 属性,时间复杂度为 O(1)。...④、二进制安全   因为C字符串空字符作为字符串结束标识,而对于一些二进制文件(如图片等),内容可能包括空字符串,因此C字符串无法正确存取;所有 SDS API 都是以处理二进制方式来处理 buf...一般来说,SDS 除了保存数据库字符串以外,SDS 还可以作为缓冲区(buffer):包括 AOF 模块AOF缓冲区以及客户端状态输入缓冲区。后面介绍Redis持久化时会进行介绍。...③、删除:各个层中找到包含指定节点,然后将节点从链表删除即可,如果删除以后只剩下头尾两个节点,则删除这一层。

70500

精讲Redis内存模型

(2)Key:图中右上角可见,Key(”hello”)并不是直接字符串存储,而是存储SDS结构。...(3)redisObject:Value(“world”)既不是直接字符串存储,也不是像Key一样直接存储SDS,而是存储redisObject。...对于整数值,判断操作复杂度为O(1);对于普通字符串,判断复杂度为O(n);而对于哈希、列表、集合和有序集合,判断复杂度为O(n^2)。进群619881427可以免费获取文中知识点视频资料。...就目前实现来说,Redis服务器初始化时,会创建10000个字符串对象,分别是0~9999整数值;当Redis需要使用为0~9999字符串对象时,可以直接使用这些共享对象。...因为C字符串空字符作为字符串结束标识,而对于一些二进制文件(如图片等),内容可能包括空字符串,因此C字符串无法正确存取;SDS字符串长度len来作为字符串结束标识,因此没有这个问题。

66351

原 GetHashCode重写指南(译文)

"法典只是指南,不是规定。" --本人对此深表赞同。...:GetHashCod返回整数应该永远相同 理想情况下, 可变对象哈希代码应该只从不能改变字段中计算, 因此对象哈希在其整个生存期内都是相同。...然而,这只是个理想情况,实际上确是: Rule:当对象包含在依赖于哈希代码保持稳定数据结构时, GetHashCode 返回整数决不能更改 使一个对象hash随着对象字段变化变化是可行,...不要将字符串哈希存储在数据库, 并期望它们永远相同。事实上有人在这上面吃过亏。 Rule: GetHashCode禁止抛出异常,必须要有返回 获取哈希代码只计算一个整数;没有任何理由能让它失败。...我把它归类为 "指南" 不是 "规则", 因为它是如此含糊。什么才叫慢?这由你来决定。

1.1K60

万字长文,38 图爆肝 Redis 基础!

这些数据结构都是底层实现,键和本身之间用什么结构组织? 2.0 键和用什么结构组织? 实际上,Redis 使用了一个哈希表来保存所有键值对。它存储是以 key-value 形式。...每个哈希桶中保存了键值对数据,哈希元素保存不是本身,而是指向具体指针。这点从下图可以看出: ?...常数复杂度获取字符串长度:C 字符串不记录长度,统计长度只能逐个遍历字符,复杂度是 O (N); SDS len 属性记录了自身长度,复杂度仅为 O (1)。...获取带表头指针、表尾指针、节点数量时间复杂度均为 O (1)。 链表使用 void * 指针来保存节点,可以保存各种不同类型。 2.3 哈希哈希表,大家也都不陌生吧?... Java 哈希底层数据结构就是数组 + 链表实现。那 Redis 哈希表是怎样实现呢? 按照惯例,上源码。

43470

哈希表(散列表)原理详解

什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码(Key value)直接进行访问数据结构 。也就是说,它通过把关键码映射到表中一个位置来访问记录,加快查找速度。...当使用哈希表进行查询时候,就是再次使用哈希函数将key转换为对应数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组定位性能进行数据定位。...哈希表是完全另外一种思路:当我知道key以后,我就可以直接计算出这个元素集合位置,根本不需要一次又一次查找!...hash就是找到一种数据内容和数据存放地址之间映射关系。 散列法:元素特征转变为数组下标的方法。 我想大家都在想一个很严重问题:“如果两个字符串哈希对应位置相同怎么办?”...答案是会,但我们这个乘法不关心溢出,因为我们根本不是为了获取相乘结果,而是为了获取index。

7.6K42
领券