首页
学习
活动
专区
工具
TVP
发布

Redis 系列】redis 学习十六,redis 字典(map) 及其核心编码结构

redis 字典(map) 及其核心编码结构 redis 是使用 C 语言编写的,但是 C 语言是没有字典这个数据结构的,因此 C 语言自己使用结构体来自定义一个字典结构 typedef struct...redisDb src\server.h 中的 redis 数据库 数据结构 /* Redis database representation....void *ptr; } robj; type 类型,占 4 个 bit ,是用来约束客户端 api 的,例如 string 类型,embstr,hash,zset 等等 encoding 编码类型...可以看出上述都是 “raw” 类型, 也就是 redis 的 sds 类型 缓存行 咱们再来看一个小例子,redis 中设置一个字符串 key 127.0.0.1:6379> set name xiaoming...reids 源码 reids-6.2.5 Redis 6.2.5 is the latest stable version.

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

Redis 内部编码与优化方式

所以此时 redis 会使用一种比较紧凑但是性能稍差的内部编码方式,内部编码方式对于开发者来说是透明的,当键中元素变多时,redis 就会自动调整内部编码方式,转换为散列表。...原始编码,将字符串以字节数组形式存储 "raw" REDIS_ENCODING_INT 整数编码,将字符串转换为整数并以整数形式存储 "int" REDIS_ENCODING_HT 哈希表编码,用于表示哈希类型的值..."linkedlist" REDIS_ENCODING_ZIPLIST 压缩列表编码,使用紧凑的字节数组存储列表类型的值 "ziplist" REDIS_ENCODING_INTSET 整数集合编码,...embstr 与 raw 在 redis3.0 版本中,引入了 REDIS_ENCODING_EMBSTR 字符串编码方式,该编码方式与 REDIS_ENCODING_RAW 类似,都是使用 sdshdr...具体的内容格式和编码方式取决于当前元素的编码类型。 列表类型 列表类型内部编码方式可能是 REDIS_ENCODING_LINKEDLIST 和 REDIS_ENCODING_ZIPLIST。

17110

Redis类型(Type)与编码(Encoding)

本篇博客将详细介绍Redis支持的数据类型以及相应的编码方式和底层实现原理。 要查看Redis某个key的内部编码,可以使用Redis自带的命令OBJECT ENCODING key。...字符串在Redis中支持三种编码方式: int:当字符串可以表示为整数时,Redis会将其转换为整数,并采用int编码方式存储。int编码方式的优点是存储空间小,操作效率高。...集合在Redis中支持两种编码方式: intset:当集合中的元素都是整数时,Redis会采用intset编码方式存储。intset编码方式的优点是存储空间小,操作效率高。...当我们对一个键进行操作时,Redis会根据该键当前的编码方式以及操作所需的编码方式,对键值对进行编码转换。...本篇博客介绍了Redis支持的五种主要数据类型以及相应的编码方式。 Redis的数据类型和编码方式是为了在不同的场景下达到最佳的性能和内存占用。

16010

Redis类型(Type)与编码(Encoding)

本篇博客将详细介绍Redis支持的数据类型以及相应的编码方式和底层实现原理。要查看Redis某个key的内部编码,可以使用Redis自带的命令OBJECT ENCODING key。...字符串在Redis中支持三种编码方式:int:当字符串可以表示为整数时,Redis会将其转换为整数,并采用int编码方式存储。int编码方式的优点是存储空间小,操作效率高。...集合在Redis中支持两种编码方式:intset:当集合中的元素都是整数时,Redis会采用intset编码方式存储。intset编码方式的优点是存储空间小,操作效率高。...当我们对一个键进行操作时,Redis会根据该键当前的编码方式以及操作所需的编码方式,对键值对进行编码转换。...本篇博客介绍了Redis支持的五种主要数据类型以及相应的编码方式。Redis的数据类型和编码方式是为了在不同的场景下达到最佳的性能和内存占用。

28320

Redis数据结构和内部编码

type命令时间返回的就是当前键的 数据结构类型,分别为:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但是这些只是redis对外的数据结构。...实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样redis会再合适的场景选择合适的内部编码。如下图: ?...可以看到每种数据结构都有两种以上的内部编码实现,例如list数据结构包括linkedlist和ziplist两种内部编码。同时有些内部编码也可以做为多种外部数据结构的内部实现,例如ziplist。...redis这样的设置有两个好处: 第一:可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构和命令。...例如redis3.2提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现,而对外部用户来说基本感知不到的。

1.1K90

Redis的对象类型及其编码方式

图片Redis的对象类型有以下几种:1. 字符串类型(string):存储字符串,通常被用作缓存、计数器等。字符串类型的编码方式有raw、int、embstr和embstr_moved。...embstr_moved:占位编码,表示该对象所存储的字符串已被迁移到其他地方。2. 列表类型(list):由多个字符串组成的有序列表。列表类型的编码方式有ziplist和linkedlist。...Redis对象的共享结构和非共享结构如下:共享结构:字符串类型的编码方式为int和embstr时,Redis对象采用共享结构。多个对象可以共享同一个字符串值,以节省内存。...非共享结构:其他类型的对象和字符串类型的编码方式为raw和embstr_moved时,Redis对象采用非共享结构。每个对象都保存自己的值,修改不会影响到其他对象。...以上就是Redis的对象类型及其编码方式,以及Redis对象的共享结构和非共享结构的介绍。

23591

Redis对象类型、对象编码及对应关系

该结构中与数据保存有关的三个属性分别是type属性,encoding属性、ptr属性: typedef struct redisObject{ // 类型 unsigned type:4; // 编码...编码和底层实现 encoding:对象使用的编码,也就是使用了什么数据结构作为对象的底层实现; 对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定; 编码常量...编码对应的底层数据结构 REDIS_ENCODING_INT long类型的整数 REDIS_ENCODING_ EMBSTR embstr编码的简单动态字符串 REDIS_ENCODING_ RAW...整数集合 REDIS_ENCODING_SKIPLIST 跳跃表和字典 类型和编码的对应关系 每种类型的对象至少使用两种不同的编码 类型 编码 对象 REDIS_STRING REDIS_ENCODING_INT...使用整型值实现的字符串对象 REDIS_STRING REDIS_ENCODING_ EMBSTR 使用embstr编码的简单动态字符串实现的字符串对象 REDIS_STRING REDIS_ENCODING

66220

《闲扯Redis四》List数据类型底层编码转换

二、编码转换#  上节《闲扯Redis三》Redis五种数据类型之List型 中说道,List类型有两种实现方式: 1、使用压缩列表(ziplist)实现的列表对象 2、使用双端链表(linkedlist...Redis列表什么时候会使用 ziplist 编码,什么时候又会使用 linkedlist 编码呢?...参见了《Redis设计与实现》,得出了一个结论: ziplist 与 linkedlist 之间存在着一种编码转换机制,当列表对象可以同时满足下列两个条件时,列表对象采用ziplist编码,否则采用linkedlist...,对象的编码也从 ziplist 变为 linkedlist 。...64字节;列表元素保存的元素数量小于512个;列表对象采用 ziplist 编码,否则采用 linkedlist 编码 (3)(Redis 3.2 版本)考虑到 Redis 的空间存储效率和时间效率,引入了

42520

基于Netty实现Redis协议的编码解码器

Redis协议编码解码的实现 本文的重点是教读者实现一个简单的Redis Protocol编码解码器。 ?...首先我们来介绍一下Redis Protocol的格式,Redis协议分为指令和返回两个部分,指令的格式比较简单,就是一个字符串数组,比如指令setnx a b就是三个字符串的数组,如果指令中有整数,也是以字符串的形式发送的...Redis协议的返回就比较复杂了,因为要支持复杂的数据类型和结构嵌套。本文是以服务端的角色来处理Redis协议,也就是编写指令的解码器和返回对象的编码器。...指令的编码格式 setnx a b => *3\r\n$5\r\nsetnx\r\n$1\r\na\r\n$1\r\nb\r\n 指令是一个字符串数组,编码一个字符串数组,首先需要编码数组长度*3\r\...然后依次编码各个字符串参数。编码字符串首先需要编码字符串的长度$5\r\n。然后再编码字符串的内容setnx\r\n。

1.6K10

《闲扯Redis四》List数据类型底层编码转换

二、编码转换  上节《闲扯Redis三》Redis五种数据类型之List型 中说道,List类型有两种实现方式: 1、使用压缩列表(ziplist)实现的列表对象 2、使用双端链表(linkedlist...Redis列表什么时候会使用 ziplist 编码,什么时候又会使用 linkedlist 编码呢? ?...参见了《Redis设计与实现》,得出了一个结论: ziplist 与 linkedlist 之间存在着一种编码转换机制,当列表对象可以同时满足下列两个条件时,列表对象采用ziplist编码,否则采用linkedlist...,对象的编码也从 ziplist 变为 linkedlist 。...:列表对象保存的所有字符串元素的长度都小于64字节;列表元素保存的元素数量小于512个;列表对象采用 ziplist 编码,否则采用 linkedlist 编码 (3)(Redis 3.2 版本)

71910

Redis五种数据结构的底层编码

Redis底层编码分类: 每种类型的对象都至少使用了两种不同的编码: 其中REDIS_ENCODING_ENBSTR和REDIS_ENCODING_RAW都是用于保存字符串值,其中embstr编码是专门用于保存短字符串的一种优化编码方式...,这种编码和raw编码一样,都使用redisObject结构和sdshdr结构结构来表示字符串对象,但raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr...编码则通过调用一次内存分配一块连续的空间,空间中依次包含redisObject结构和sdshdr两个结构,如下图所示: 参考文档: 1、《Redis设计与实现》 2、https://blog.csdn.net.../XiyouLinux_Kangyijie/article/details/78045385  Redis的embstr与raw编码方式不再以39字节为界了

34020

跟着大彬读源码 - Redis 8 - 对象编码之字典

由于 C 语言没有内置字典这种数据结构,因此 Redis 构建了自己的字典实现。 在 Redis 中,就是使用字典来实现数据库底层的。对数据库的 CURD 操作也是构建在对字典的操作之上。...当一个哈希键包含的键值对比较多,又或者键值对中的元素都是比较长的字符串时,Redis 就会适应字典作为哈希键的底层实现。 1 字典的实现 Redis 的字典使用哈希表作为底层实现。...Redis 的哈希表使用链地址法来解决建冲突。...因此,为了避免 rehash 对服务器性能造成影响,Redis 分多次、渐进式的将 ht[0] 里面的键值对 rehash 到 ht[1]。...总结 字段被广泛用于实现 Redis 的各种功能,其中包括数据库和哈希键。 Redis 中的字典使用哈希表作为底层实现,每个字典带有两个哈希表,一个平时使用,一个仅在 rehash 时使用。

63020

redis数据结构及内部编码-string数据结构

每种数据结构都有自己底层的内部实现,并且每个都有多种实现,这样方便redis在合适的场景选择适合当前的编码方式。 下图是redis每种数据结构对应的内部编码 ?...redis数据结构内部编码 我们 可以通过 object encoding命令查询 eg: 127.0.0.1:6379> set hello "sss" OK 127.0.0.1:6379> object...INT 编码方式 当字符串键值的内容可以用一个64位有符号整型表示的时候,redis会将键值转换为long类型来存储,其对应的编码类型为:OBJ_ENCODING_INT 对于set hel "123"...EMBSTR编码格式 Redis 在保存长度小于 44 字节的字符串时会采用 OBJ_ENCODING_EMBSTR 编码方式,源码如下(object.c): /* Create a string object...RAW 编码格式 通过上面的源码分析,当字符串键值的长度大于44的时候,redis会将键值的内部编码方式改为OBJ_ENCODING_RAW格式 /* Create a string object with

1.1K30
领券