0%

源码位置:t_hash.c/server.h

hash 对象底层编码方式有两种,ziplisthashtable
使用 ziplist 编码需要同时满足以下条件:

  • hash 对象保存的键值对的键和值的字符串长度小于 64 字节(可通过 redis.conf 配置:hash_max_ziplist_value)
  • hash 对象保存的键值对数小于 512 个(可通过 redis.conf 配置:hash_max_ziplist_entries)
阅读全文 »

源码位置:t_string.c/server.h

字符串是redis中最常用的数据结构,在对象系统object一文中我们提到,字符串数据结构根据场景会有三种编码类型:OBJ_ENCODING_RAWOBJ_ENCODING_INTOBJ_ENCODING_EMBSTR,分别对应底层数据结构:sds、int、sds。下面说说这三种编码类型的使用场景。

阅读全文 »

概念

常用的缓存过期淘汰策略有:LRU、LFU、FIFO等,因为FIFO(First in first out)算法是一种先进先出的队列,算法很简单,就不具体描述了,下面介绍LRU和LFU的算法策略。

阅读全文 »

什么是内存对齐

内存对齐,也叫字节对齐。
现代计算机中,内存空间都是按照字节划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

阅读全文 »

源码位置:rax.c/rax.h

Redis 5.0版本引入的一个新的数据结构。目前主要用在stream这个数据结构上。Rax是一个有序字典树(基数树),按照key的字典序排列,支持快速定位、查找和删除操作。

阅读全文 »

源码位置:listpack.c/listpack.h

Redis 5.0版本引入的一个新的数据结构,它是对ziplist压缩列表的改进,listpack结构更为精简,更加节省内存空间。它的实现方式也和ziplist很类似,所以阅读理解起来并不难。也许该数据结构设计出来是要替代ziplist的,只不过ziplist目前在redis中的应用非常广泛,替换起来复杂度很高,所以目前该数据结构只有在新引入的stream数据结构中使用,可能将来有一天会全面替换ziplist。

相对于ziplist,listpack取消了存储前置节点长度的字段,listpack的节点之间是相互独立的,改变前置节点的长度,不会影响到后续节点的长度,所以再也不需要连锁更新操作。

阅读全文 »

源码位置:object.c/server.h

在之前的文章中,我们介绍了redis底层的数据结构,比如简单动态字符串,双端链表,跳跃表,字典,整数集合,压缩列表,快速列表,基数树,紧凑列表等。

阅读全文 »

简介

有些信息存储时,并不需要占用一整个完整的字节,而只需要占几个或一个二进制位。例如存放一个开关变量时,只需要用到0或1两种状态,用一位二进制位即可。所以,为了节省空间,C语言提供了一种叫位域的数据结构。

阅读全文 »

源码位置:quicklist.c/quicklist.h

Redis3.2版本以前的列表底层的编码是ziplist和linkedlist(adlist.c)实现的,3.2版本后引入了quicklist的数据结构,列表底层都由quicklist来实现。本质上,quicklist是由ziplist和linkedlist结合而成。所以,学习quicklist之前,需要明白ziplist的原理。

阅读全文 »