一个键盘码代码,两只黄鹂名翠柳

redis字符串——sds源码解析

redis没有直接使用C语言传统的字符串(以空字符结尾的字符串数组),而是自己构建了一种为简单动态字符串(simple dynamic strring, SDS), 并将SDS作为redis默认的字符串表示。数据结构redis定义的SDS由协议头和字符串组成,根据字符串的长度分为五种不同类型的字符串,不同长度的字符串分别使用不用的类型。header组成header = len  + alloc  + flag + bufheader释义len字符串的长度alloc字符串实际占用的存储空间(不包含header和null)flag字符串类型, sdshdr5 ... sdshdr64buf字符串指针SDS类型类型字符串长度备注sdshdr50 - 31空字符串使用sdshdr8表示sdshdr832 - 255sdshdr1 查看全文

redis链表数据结构及源码解析

链表在redis中使用非常频繁,常用的list数据就是使用链表数据结构,除此之外,还有发布与订阅、监视器也用到了链表。数据结构redis的链表由多个链表节点组成,每个链表节点分别保存了前驱和后继节点,形成了一个双向链表。最终的链表会包含一个头节点、尾节点以及链表长度。具体定义如下。1、链表节点typedef struct listNode {     // 前驱节点     struct listNode *prev;     // 后继节点     struct listNode *next; &nbs 查看全文

redis字典数据结构源码解析

字典,又称关联数组或者映射,是用于保存键值对的数据结构,字典中的每一个key都是唯一的。通常用作hash类型和string类型的数据存储结构。数据结构redis的字典是由两张hash表组成的,以用户字典的扩容,hash表的基本数据类型是hash表节点。具体定义如下。1、字典typedef struct dict {     dictType *type;     // 保存了type中需要用的私有数据     void *privdata;     // ht[0]用来正常访问,ht[1]用来rehashing   查看全文

redis跳跃表数据结构源码解析

跳跃表,是一种有序的数据结构,可以在一个节点中维护多个执行其他节点的指针,从而快速访问其他节点。大多数情况下跳跃表的效率可以跟平衡树相媲美,并且跳跃表的实现相对简单,redis使用跳跃表做有序集合的底层实现。数据结构redis的跳跃表包含头尾指针、跳跃表的长度以及维护的跳跃表中的最大层数。跳跃表的接点由key、score、前驱节点以及多个后继节点的指针组成。1、跳跃表typedef struct zskiplist {     // 头节点和尾节点     struct zskiplistNode *header, *tail;     // 跳跃表的长 查看全文

redis整数集合数据结构源码解析

整数集合是集合键的底层实现之一,当一个集合只包含整数时,redis会使用整数集合作为集合的底层实现,整数集合类型会尽可能的节约内存空间,只有新插入的数据大于encoding时,才会升级集合类型。数据结构整数集合的定义包含三个部分,encoding表示集合元素的数据类型,length表示集合包含多少元素,contents存储集合成员的一段连续的地址空间。1、整数集合typedef struct intset {     // 集合的编码,可以为16 32 64位的整数类型     uint32_t encoding;     // 集合长度  & 查看全文

Redis保存多大的Key-Value合适

1. 避免大key首先,需要明确的是,Redis官方并不推荐存储过大的key或value。大key不仅占用大量内存,而且在处理时(如读取、写入、删除)可能会导致Redis性能下降,甚至阻塞整个Redis服务。因此,在设计Redis数据结构时,应尽量避免创建大key。2. 合理的key大小关于key的大小,一般建议key的长度不要超过1024字节,这是为了确保key的存储效率和可读性。虽然Redis本身可以支持更长的key,但过长的key会增加内存的消耗,并且降低查询效率。3. 评估value的大小对于value的大小,虽然没有固定的限制(最大为512MB),但应根据实际需求进行合理评估。如果某个key的value非常大,应考虑将其拆分成多个小key来存储。这样做不仅可以提高Redis的存储效率,还可以避免在删除或修改大value时导致的性能问题。 查看全文

Redis主要数据类型的编码

简单动态字符串底层编码整数字符串对象embstr编码的字符串对象简单动态字符串转换long int使用int编码float使用 简单动态字符串编码当使用embstr编码的字符串长度大于39时,转换为简单动态字符串编码列表底层数据结构压缩列表双端链表转换列表元素长度大于64个字节或者列表元素数量大于512压缩列表编码则转换为双端链表Hash底层数据结构压缩列表字典转换列表元素长度大于64个字节或者列表元素数量大于512压缩列表编码则转换为字典集合底层数据结构整数集合,int16 int32 int64字典。存储时字典的key存储集合元素,value存储null转换整数集合转换为字典,存储的整数数量超过512则使用字段有序集合底层数据结构压缩列表跳跃表转换压缩列表编码要求集合元素数量小于128,元素大小小于64字节。不满足这两个条件则转换为跳跃表。 查看全文

Redis主要底层数据结构扩容

简单动态字符串如果SDS修后的长度小于1MB,则将SDS扩容为修改后的字符串长度的2倍(未使用的空间设为修改后的字符串长度)如果SDS修后的长度大于等于1MB,则将SDS扩容1MB的空间(未使用的空间设为1MB)如果字符串缩短,SDS选择惰性释放,将释放的空间使用free记录下来,以便下次使用hash触发条件扩容未执行BGSAVE,负载因子大于等于1时执行BGSAVE快照时,负载因子大于等于5时,以尽量避开服务器快照期间扩容缩容负载因子小于0.1时渐进式rehash扩缩容大小扩容,首次大于 字典里元素数量*2*2^n 缩容,   首次大于 字典里元素数量*2^n  查看全文
加载更多
redis ( 8 )
php ( 6 )
go ( 5 )
源码 ( 5 )
index ( 5 )
ssl ( 4 )
数据结构 ( 4 )
https ( 3 )
awk ( 3 )
http ( 3 )
hql ( 3 )
字体 ( 3 )
php:// ( 2 )
chrome ( 2 )
链表 ( 2 )
firefox ( 2 )
跳跃表 ( 2 )
测试 ( 2 )