对象编码种类*/ #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
表示形式 Redis 自身已经是键值对结构了 Redis 自身的键值对就是通过哈希的方式来组织的 把 key 这一层组织完成之后,到了 value 这一层,value 这一层也可以是哈希 哈希类型中的映射关系通常称为...hash 元素个数太多,执行的时间就会比较长,从而阻塞 Redis 一条命令,就能完成所有的遍历操作 HSCAN 遍历 Redis 的 hash,“渐进式遍历“ 敲一次命令,遍历一小部分 再敲一次命令...哈希的内部编码有两种: ziplist:压缩列表 hashtable:哈希表 压缩: rar zip gzip 7z … 这是一些具体的压缩算法。...压缩的本质,是针对数据进行重新编码。...不同的数据,有不同的特点,结合这些特点,进行精妙的设计,重新编码之后,就能够缩小体积 比如,现在有字符串:abcccddddeeeee 重新编码表示:1a2b3c4d5e 重新编码后的结果就比原来的短了
hashtable 有序集合对象 OBJ_ZSET "zset" OBJ_ENCODING_ZIPLIST \ OBJ_ENCODING_SKIPLIST ziplist \ skiplist(包含ht) 编码转换总结...对象 原始编码 升级编码 -- 字符串对象 INT embstr raw 字符串对象 整数并且小于long 2^63-1 超过44字节,被修改 哈希对象 ziplist hashtable 哈希对象
中被称为 编码 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 编码。...,Redis 使用 embstr 编码。...44 字节时,Redis 使用 raw 编码。
因此,String 在 Redis 中有其他三种编码方式: int、embstr、raw 。...其中, raw 和 embstr 类型,都是基于动态字符串(SDS)实现的 string类型的三大编码 对于不同的对象,Redis会使用不同的类型来存储。...对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。 int 编码 当存储的值为整数,且值的大小可以用 long 类型表示时,Redis 使用 int 编码。...,且长度大于 44 字节时,Redis 使用 embstr 编码。...44 字节时,Redis 使用 raw 编码。
️前言 精彩导读 本次我们将全面剖析Redis的核心技术要点,包括其丰富的数据类型体系、高效的编码方式以及秒级响应的性能奥秘。...数据结构 可以发现,这里的数据结构即我们之前学习的数据结构,但是redis在底层上实现上述的数据结构时候,会进行特定的优化,达到节省空间时间的效果; 所以在内部的具体的实现的数据结构(编码方式)就会存在变化...在hash表中,redis在进行插入,查询时间复杂度就是1,但是背后的实现不一定就是哈希表(使用别的数据结构实现),但是保证时间复杂度为O(1) ️2.内部的编码方式 具体的编码方式如下图所示...首先介绍Redis如何优化基础数据结构,通过灵活编码(如string类型采用raw/embstr/int编码)实现时空平衡;其次详解各数据类型(hash/list/set/zset)的底层实现,如ziplist...文章通过具体命令示例和编码转换条件,展现了Redis精巧的内部设计哲学。
️1.String类型详解 1.1基本情况 redis中的字符串,直接按照二进制数据方式进行存储(不会做任何编码转换,存啥取啥) 在redis的value中是可以存储:文本,整数,json,xml,二进制的图片以及视频...,一个汉字在utf8字符编码中,一个汉字通常占3个字节 在启动redis的时候,添加--raw这样的raw这样的选项,可以使redis客户端能自动的把二进制数据尝试翻译 可以发现这是以16进制来进行表示的...strlen key key存放的类型不是string类型报错,key不存在返回0 执行的情况如下所示: 一个字符为两个字节,一个utf8编码的汉字占三个字节~~~ ️2.string内部编码方式...2.1内部编码 int:8个字节的长整型 embstr:小于等于39字节的字符串,适用于比较短的字符串 raw:大于39字节的字符串,适用更长的字符串 通过object encoding key来查看编码方式...其次揭示内部编码机制(int/embstr/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 的空间存储效率和时间效率,引入了
、删除操作,都保证时间复杂度是 O(1) 但是,这个背后的实现,不一定就是一个标准的 hash 表,可能在特定的场景下,使用别的数据结构实现,但是仍然保证时间复杂度符合承诺 编码方式 数据结构:Redis...承诺给你的,也可以理解成数据类型 编码方式:Redis 内部底层的实现 同一个数据类型,背后可能的编码实现方式是不同的,会根据特定场景优化 string string:Redis 会自动适应,程序员在使用...每个节点上有多个指针域,巧妙地搭配这些指针域的指向,就可以做到从跳表上查询元素的复杂度是 O(logN) (类似于平衡二叉搜索树(如 AVL 树、红黑树)) ziplist: 查询内部编码 语法: object...encoding Redis 会自动根据当前的事迹情况选择内部的编码方式,自动适应。...那我们是否要记住,什么时候使用什么编码方式呢? 只记思想,不记数字!
二、编码转换 上节《闲扯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 版本)