redis内部的所有键值对是两个hash结构,维护了键值对和过期时间
SDS动态字符串,可以修改。结构体中维护了数组的容量和长度,在占用字节数较小时采用embstr(使用malloc分配一次内存,对象头和数据连续存储)的形式存储,在长度较大时采用raw形式(malloc分配两次内存,对象头和数据分开存储)存储。
扩容策略:长度小于1M时加倍扩容,长度大于1M时每次扩容增加1M
常用指令:
快速列表:连续存储元素的ziplist通过指针连接起来组成快速列表。
基本操作:
一块连续的内存空间,元素之间紧凑存储,没有冗余间隙。元素体维护着前一个元素的长度(长度小于254时占用一个字节,超过时占用5个字节)、编码、数据,可以存储不同类型的数据,通过编码优化存储占用。
注意点:
通过将ziplist通过前后指针连接起来形成的双向链表。
注意点:
类似与hashmap,内部是数组加链表的结构,不过内部结构维护了两个hash结构。因为redis为了高性能在rehash时采用了渐进式的rehash方式(查询时同时查询两个hash结构)。
基本操作:
注意点:
相当于hashset,无序键值对,元素的value为NULL。
基本操作:
内部结构是hash字典和跳跃列表,字典存储value和score的对应关系,跳跃列表提供按照score来排序的功能。
基本操作:
跳跃列表基本操作实现:
从header的最高层开始查找,直到找到本层最后一个比目标score小的元素,然后进入到下一层,重复上一步骤,直到找到目标元素或遍历到最底层。
先删除后增加
根据value获取score后,将搜索路径上的span跨度值相加就是元素排名。