《Redis源码详解》
图文解说 Redis 底层实现
英雄哪里出来
2021年CSDN博客之星TOP1,B站2022年度新人奖up主,「 夜深人静写算法 」作者,三年ACM,校集训队队长,亚洲区域赛金牌,世界总决赛简单去了一趟。曾就职网易多年,目前在字节,内推可私聊。
展开
-
Redis底层详解(一) 哈希表和字典
一文读懂哈希表原创 2018-06-28 17:27:37 · 337193 阅读 · 16 评论 -
Redis底层详解(二) 字符串
一、sds字符串概述 sds 字符串即 Simple Dynamic String(即简单动态字符串),其中动态的含义是内存的分配是动态的,sds的定义如下: 它采用一段连续的内存来存储 sds 结构。和普通字符串 char* 不同,sds 是二进制安全的,并不以 '\0' 来标识字符串结尾,于是必须要有一个 len 字段来标记这个字符串的长度。那么,我们...原创 2018-07-23 08:07:47 · 312313 阅读 · 3 评论 -
Redis底层详解(三) 内存管理
一、内存分配概述 redis 的内存分配,实质上是对 tcmalloc / jemalloc 的封装。内存分配本质就是给定需要分配的大小,以字节为单位,然后返回一个指向一段分配好的连续的内存空间的首指针。 通过这个首指针,我们需要知道它的连续空间的大小,才能进行内存统计,某些低版本的 tcmalloc / jemalloc 不支持通过给定指针获取它申请的内存块...原创 2018-11-29 07:45:47 · 297527 阅读 · 3 评论 -
Redis底层详解(四) 整数集合
一、集合概述 对于集合,STL 的 set 相信大家都不陌生,它的底层实现是红黑树。无论插入、删除、查找都是 O(log n) 的时间复杂度。当然,如果用哈希表来实现集合,插入、删除、查找都可以达到 O(1)。那么为什么集合要用红黑树和没有用哈希表呢?我想,最大的可能是基于集合自身的特性,集合有它特有的操作:求交、求并、求差。这三个操作对于哈希表来说都是 O(n) 的。基于这...原创 2018-12-03 07:42:57 · 315861 阅读 · 0 评论 -
Redis底层详解(五) 压缩列表
一、压缩列表概述 压缩列表是一种编码过的“链表”旨在实现高效的内存管理。它可以存储整数和字符串,整数以小端序存储,字符串则以字节数组存储。压缩列表的内存存储结构如下图所示: 其中zlbytes、zltail、zllen 是 压缩列表头( ziplist header ),entry1 到 entryN 是列表的结点部分,zlen 是结尾标记。二、压缩列表...原创 2018-12-12 08:04:04 · 299739 阅读 · 6 评论 -
Redis底层详解(六) 跳跃表
一、跳跃表概述 跳跃表是有序集合的底层实现之一。 1、跳跃表结点 跳跃表的结点 zskiplistNode 定义在 server.h 中,定义如下:typedef struct zskiplistNode { robj *obj; /* a */ double scor...原创 2018-12-18 23:55:52 · 294466 阅读 · 2 评论 -
Redis底层详解(七) HyperLogLog 基数估计
一、HyperLogLog 概述 HyperLogLog 算法一种概率算法,用来实现大数据下的基数估计,即无法精确计算集合的基数,存在一定偏差。具体的算法实现可以参见我写的另一篇文章:夜深人静写算法(十四)- 基数估计 (Cardinality Estimation)。 Redis 对这个算法进行了一些改进。主要有以下几点: a) ...原创 2019-01-14 19:54:02 · 169502 阅读 · 2 评论 -
Redis底层详解(八) LRU 算法
一、LRU 算法概述 1、LRU 概述 LRU 是Least Recently Used 的缩写,即最近最少使用,是内存管理的一种页面置换算法。算法的核心是:如果一个数据在最近一段时间内没有被访问到,那么它在将来被访问的可能性也很小。换言之,当内存达到极限时,应该把内存中最久没有被访问的数据淘汰掉。 那么,如何表示这个最久呢?Redi...原创 2019-02-11 13:16:39 · 241621 阅读 · 2 评论