对象编码种类*/ #define OBJ_ENCODING_RAW 0 /* Raw representation */ #define OBJ_ENCODING_INT 1 /* Encoded...LFUGetTimeInMinutes()<<8) | LFU_INIT_VAL; } else { o->lru = LRU_CLOCK(); } return o; } https://redis.io.../docs/reference/modules/ https://www.redis.com.cn/modules.htmlhttps://segmentfault.com/a/1190000020104277...utm_source=tag-newest https://www.fatalerrors.org/a/research-on-the-workflow-of-redis-source-code-learning.html...https://redis.com/community/redis-modules-hub/how-to-build/
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.
所以此时 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。
本篇博客将详细介绍Redis支持的数据类型以及相应的编码方式和底层实现原理。 要查看Redis某个key的内部编码,可以使用Redis自带的命令OBJECT ENCODING key。...字符串在Redis中支持三种编码方式: int:当字符串可以表示为整数时,Redis会将其转换为整数,并采用int编码方式存储。int编码方式的优点是存储空间小,操作效率高。...集合在Redis中支持两种编码方式: intset:当集合中的元素都是整数时,Redis会采用intset编码方式存储。intset编码方式的优点是存储空间小,操作效率高。...当我们对一个键进行操作时,Redis会根据该键当前的编码方式以及操作所需的编码方式,对键值对进行编码转换。...本篇博客介绍了Redis支持的五种主要数据类型以及相应的编码方式。 Redis的数据类型和编码方式是为了在不同的场景下达到最佳的性能和内存占用。
本篇博客将详细介绍Redis支持的数据类型以及相应的编码方式和底层实现原理。要查看Redis某个key的内部编码,可以使用Redis自带的命令OBJECT ENCODING key。...字符串在Redis中支持三种编码方式:int:当字符串可以表示为整数时,Redis会将其转换为整数,并采用int编码方式存储。int编码方式的优点是存储空间小,操作效率高。...集合在Redis中支持两种编码方式:intset:当集合中的元素都是整数时,Redis会采用intset编码方式存储。intset编码方式的优点是存储空间小,操作效率高。...当我们对一个键进行操作时,Redis会根据该键当前的编码方式以及操作所需的编码方式,对键值对进行编码转换。...本篇博客介绍了Redis支持的五种主要数据类型以及相应的编码方式。Redis的数据类型和编码方式是为了在不同的场景下达到最佳的性能和内存占用。
type命令时间返回的就是当前键的 数据结构类型,分别为:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但是这些只是redis对外的数据结构。...实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样redis会再合适的场景选择合适的内部编码。如下图: ?...可以看到每种数据结构都有两种以上的内部编码实现,例如list数据结构包括linkedlist和ziplist两种内部编码。同时有些内部编码也可以做为多种外部数据结构的内部实现,例如ziplist。...redis这样的设置有两个好处: 第一:可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构和命令。...例如redis3.2提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现,而对外部用户来说基本感知不到的。
图片Redis的对象类型有以下几种:1. 字符串类型(string):存储字符串,通常被用作缓存、计数器等。字符串类型的编码方式有raw、int、embstr和embstr_moved。...embstr_moved:占位编码,表示该对象所存储的字符串已被迁移到其他地方。2. 列表类型(list):由多个字符串组成的有序列表。列表类型的编码方式有ziplist和linkedlist。...Redis对象的共享结构和非共享结构如下:共享结构:字符串类型的编码方式为int和embstr时,Redis对象采用共享结构。多个对象可以共享同一个字符串值,以节省内存。...非共享结构:其他类型的对象和字符串类型的编码方式为raw和embstr_moved时,Redis对象采用非共享结构。每个对象都保存自己的值,修改不会影响到其他对象。...以上就是Redis的对象类型及其编码方式,以及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
hashtable 有序集合对象 OBJ_ZSET "zset" OBJ_ENCODING_ZIPLIST \ OBJ_ENCODING_SKIPLIST ziplist \ skiplist(包含ht) 编码转换总结...对象 原始编码 升级编码 -- 字符串对象 INT embstr raw 字符串对象 整数并且小于long 2^63-1 超过44字节,被修改 哈希对象 ziplist hashtable 哈希对象
因此,String 在 Redis 中有其他三种编码方式: int、embstr、raw 。...其中, raw 和 embstr 类型,都是基于动态字符串(SDS)实现的 string类型的三大编码 对于不同的对象,Redis会使用不同的类型来存储。...对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。 int 编码当存储的值为整数,且值的大小可以用 long 类型表示时,Redis 使用 int 编码。...,Redis 使用 embstr 编码。...44 字节时,Redis 使用 raw 编码。
中被称为 编码 encoding ,下面逐一介绍这些编码实现。...,参考 redis 作者原话: REDIS_ENCODING_EMBSTR_SIZE_LIMIT set to 39....编码,否则只能使用 hashtable 编码 set-max-intset-entries :当 set 中的元素数量小于该值时使用 intset 编码(默认为 512) 包含非整数元素的情况: 127.0.0.1...ziplist 编码(默认为 128) Redis 整体结构 每个数据库都是一个 redisDb 结构体: typedef struct redisDb { dict *dict;...的几种编码方式都介绍完毕,后续将对 redis 的一些其他细节进行分享,感谢观看。
因此,String 在 Redis 中有其他三种编码方式: int、embstr、raw 。...其中, raw 和 embstr 类型,都是基于动态字符串(SDS)实现的 string类型的三大编码 对于不同的对象,Redis会使用不同的类型来存储。...对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。 int 编码 当存储的值为整数,且值的大小可以用 long 类型表示时,Redis 使用 int 编码。...,且长度大于 44 字节时,Redis 使用 embstr 编码。...44 字节时,Redis 使用 raw 编码。
这 5 种类型是 Redis 对外提供的,实际上,在 Redis 内部,每种类型可能有 2 种或更多的内部编码实现。 本文着重介绍字符串编码。...示例: 终端控制台设置采用GBK编码 终端控制台设置采用UTF-8编码 补充:命令【strlen $key】会返回$key的长度 在GBK情况下,redis-server是不知道客户端外围什么编码。...字符串编码-Int和Raw Redis中的String编码是指Redis中存储字符串时所使用的数据结构。Redis中的字符串最大长度为512MB。...raw 编码(或 sdshdr) 适用条件:当存储的字符串不是整数,或者字符串的长度超过了 int 编码的阈值时,Redis 会使用 raw 编码。...编码转换 Redis 在存储 String 类型的数据时,会根据数据的实际情况自动选择合适的编码方式。
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。
二、编码转换# 上节《闲扯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 的空间存储效率和时间效率,引入了
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字节为界了
二、编码转换 上节《闲扯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中的数据类型和内部编码 二. Redis的单线程模型 面试题: redis是单线程模型,为什么效率之高,速度之快呢?...Redis对外的数据结构.如下图所示: (上述有序集合,相当于是除了存储member之外,还需要存储一个score(权重 分数)) 实际上Redis针对每种数据结构都有自己的底层内部编码实现,...而且是多种实现,这样Redis会在合适的场景选择合适的内部编码....编码方式: redis内部底层的实现. 在同一个数据结构中,背后的编码方式的实现可能是不同的.会根据特定场景进行优化....:object encoding key 总的来说,redis会根据当前的实际情况选择内部的编码方式自适应.
由于 C 语言没有内置字典这种数据结构,因此 Redis 构建了自己的字典实现。 在 Redis 中,就是使用字典来实现数据库底层的。对数据库的 CURD 操作也是构建在对字典的操作之上。...当一个哈希键包含的键值对比较多,又或者键值对中的元素都是比较长的字符串时,Redis 就会适应字典作为哈希键的底层实现。 1 字典的实现 Redis 的字典使用哈希表作为底层实现。...Redis 的哈希表使用链地址法来解决建冲突。...因此,为了避免 rehash 对服务器性能造成影响,Redis 分多次、渐进式的将 ht[0] 里面的键值对 rehash 到 ht[1]。...总结 字段被广泛用于实现 Redis 的各种功能,其中包括数据库和哈希键。 Redis 中的字典使用哈希表作为底层实现,每个字典带有两个哈希表,一个平时使用,一个仅在 rehash 时使用。
每种数据结构都有自己底层的内部实现,并且每个都有多种实现,这样方便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
领取专属 10元无门槛券
手把手带您无忧上云