02 2024 档案
摘要:String是Redis中最常见的数据存储类型: 其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。 RedisObject的头和SDS是两个独立的内存空间 如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间。申
阅读全文
摘要:RedisObject redis中的任意数据类型的键和值都会封装为一个RedisObject,也叫做Redis对象。 Redis对象头部占16个字节 (不包含指针指向的内存空间),所以大量数据使用的情况下,不推荐使用OBJ_STRING类型存储,用OBJ_LIST更好 Redis的编码方式
阅读全文
摘要:SkipList SkipList(跳表)首先是链表,但与传统链表相比有几点差异: 元素按照升序排列存储 节点可能包含多个指针,指针跨度不同(最多允许32级指针,跨度成倍数递增) SkipList的特点: 跳跃表是一个双向链表,每个节点都包含score和ele值 节点按照score值排序,score
阅读全文
摘要:问题1:ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办? 为了缓解这个问题,我们必须限制ZipList的长度和entry大小。 问题2:但是我们要存储大量数据,超出了ZipList最佳的上限怎么办? 我们可以创建多个ZipList来分片存储数据。 问
阅读全文
摘要:ZipList是一种特殊的“双端链表”,由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1)。 ZipListEntry ZipList中的Entry并不像普通链表那样记录前后节点的指针,因为记录两个指针要占用16个字节,浪费内存。而是采用了下面的结构
阅读全文
摘要:redis的键和值的映射关系是通过Dict来实现的。 Dict由三部分组成,分别是哈希表(DictHashTable)、哈希节点(DictEntry)、字典(Dict)。 size的大小总是2的N次方 sizemask的大小是size-1 used因为哈希的存储特性(不同元素相同的哈希值,即哈希冲突
阅读全文
摘要:IntSet IntSet是redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。 可能会有疑惑,int8_t 的数组contents只有1个字节,怎么可能存的下数组,其实这里的contents存储的只是指向真正数组的指针。 IntSet的取值范围大小,实际上是由e
阅读全文
摘要:字符串是redis最常见的数据结构,但redis并没有直接使用C语言的字符串,是因为C语言本身其实是没有字符串的,所谓的字符串其实是字符数组(Java语言中的字符串是一个对象),所以C语言的字符串有很多问题: ① 获取字符串长度需要通过运算 C语言的字符串数组都是以’\0’结尾,这是一个字符串的结束
阅读全文