
源码略读
文章平均质量分 62
Jamgun zhang
这个作者很懒,什么都没留下…
展开
-
redis 源码阅读 - 内存编码篇 - 压缩列表 ziplist
2.压缩列表 ziplist.h 和 ziplist.c数据结构定义有序整数集合typedef struct zlentry { // prevrawlen :前置节点的长度 // prevrawlensize :编码 prevrawlen 所需的字节大小 unsigned int prevrawlensize, prevrawlen; // len :当前节点值的长度 // lensize :编码 len 所需的字节大小 unsigned int原创 2021-07-15 23:38:38 · 162 阅读 · 0 评论 -
redis 源码阅读 - 内存编码篇 - 有序整数集合 intset
1.有序整数集合 intset.h 和 intset.c数据结构定义有序整数集合typedef struct intset { // 编码方式 uint32_t encoding; // 元素数量 uint32_t length; // 保存整数元素的数组 int8_t contents[];} intset;编码方式#define INTSET_ENC_INT16 (sizeof(int16_t))#define INTSET_ENC原创 2021-07-15 23:33:30 · 213 阅读 · 0 评论 -
rcu入门
是什么可参考官方文档Read-copy update,可以理解为,先读数据,修改之后,一次性替换旧数据是linux内核的同步机制,提供线程安全的并发访问应用场景典型应用场景链表读多写少实现链表插入节点在A之前插入节点,分为3步1.new 新节点2.新节点next指针指向A3.前置节点的next指针,指向新节点分析在2步之后时,所有遍历链表操作正常在3步之后,所有遍历链表操作也均正常因为改变指针是原子的,所以不会有问题链表原创 2021-07-14 23:59:56 · 419 阅读 · 1 评论 -
Tcmalloc SetMemoryReleaseRate(double) 和 ReleaseFreeMemory()浅析
问题Tcmalloc 由于使用了精心设计的 cache,进而大大提高了malloc 和 free 的效率,但由之而来的是 cache 大小的难以把控,容易出现 cache 占用过大,进而 OOM 的问题,tcmalloc 提供了两个方案解决这个问题展现 tcmalloc 维护的内存状态解决//virtual void GetStats(char* buffer, int buffer_length);MallocExtension::instance()->GetStats(buf, l原创 2021-06-22 23:09:08 · 1149 阅读 · 0 评论 -
redis源码阅读-数据结构篇-hyperloglog
文章目录5. HyperLogLog 实现 hyperloglog.c数据结构定义Helper函数(可跳过,需要时阅读)元素哈希处理 O(1)添加基数 O(1)...5. HyperLogLog 实现 hyperloglog.c数据结构定义hllhdrstruct hllhdr { char magic[4]; /* "HYLL" */ uint8_t encoding; /* HLL_DENSE or HLL_SPARSE. */ uint8_t notu原创 2021-06-09 23:20:54 · 364 阅读 · 3 评论 -
redis源码阅读-数据结构篇-跳表
文章目录4. 跳表实现 redis.h 和 t_zset.c数据结构定义Helper函数(可跳过,需要时阅读)node 构造函数 O(1)构造函数 O(1)node 析构函数 O(1)析构函数 O(n)insert object O(logn)delete object O(logn)根据score,范围删除 O(logn)根据rank,范围删除 O(logn)获取 rank O(logn)get by rank O(logn)4. 跳表实现 redis.h 和 t_zset.c数据结构定义obj原创 2021-06-09 23:14:26 · 331 阅读 · 0 评论 -
redis源码阅读-数据结构篇-字典dict
文章目录4. 字典实现 dict.h 和 dict.c数据结构定义部分宏定义哈希函数(本部分可选跳过)Helper函数(可跳过,需要时阅读)dict 构造函数 O(1)dict 析构函数 O(N)hashtable 构造函数 O(1)dict resize O(1)rehash O(m)限时rehashset k O(1)set kv O(1)get k O(1)update k O(1)update kv O(1)delete kv O(1)get iter O(1)delete iter O(1)迭代原创 2021-06-09 22:52:06 · 563 阅读 · 0 评论 -
redis源码阅读-数据结构篇-双端列表adlist
文章目录3. 双端链表 adlist.h 和 adlist.c数据结构定义构造函数析构函数get iterdelete iterreset iter迭代add node to headinsert nodedelete nodeget node by keyget node by indexcopy listrotate3. 双端链表 adlist.h 和 adlist.c数据结构定义节点// 节点typedef struct listNode { struct listNode *p原创 2021-06-09 22:34:08 · 358 阅读 · 0 评论 -
redis源码阅读-数据结构篇-字符串sds
文章目录2. 动态字符串 sds.h 和 sds.c数据结构定义构造函数析构函数resizeconcatcopycmpsplitstolrange2. 动态字符串 sds.h 和 sds.c数据结构定义抽象 字符串typedef char *sds;struct sdshdr { // 跟内存管理类似,加上prefix维护size信息 int len // buf 中已占用空间的长度 int free; // buf 中剩余可用空间的长度 char b原创 2021-06-09 22:27:15 · 229 阅读 · 0 评论 -
redis源码阅读-数据结构篇-内存管理
1. 内存管理**malloc和free**void *zmalloc(size_t size); // 对malloc的封装void *zcalloc(size_t size); // 对calloc的封装void *zrealloc(void *ptr, size_t size); // 对realloc的封装void zfree(void *ptr); // 对free的封装zmalloc// 与普通malloc...的区别主要在于有没有pr原创 2021-06-09 22:16:33 · 149 阅读 · 1 评论 -
Redis 中 HyperLogLog 讲解
是什么一个算法论文指路可视化展示作用估计集合的基数(去重元素个数)[a,b,c,d] 的基数是 4[a,b,c,d,a] 的基数还是 4原理概率论的伯努利实验 + 修正让我们玩一个游戏你来掷硬币,我来猜你掷了多少回合每回合规定,直到掷出反面结束,否则一直掷比如你可以一直掷正面,不结束该回合也可能第一次就是正面,回合结束我需要的唯一信息你掷硬币次数最多的回合,掷了多少次硬币答案很简单若你最多掷了n次,则你掷了 (1 <&原创 2021-06-09 21:59:25 · 177 阅读 · 0 评论 -
shared_from_this() 实现原理
shared_from_this() 实现原理shared_ptr 实现原理作用C++中采用new和delete来申请和释放内存,但如果管理不当,很容易出现内存泄漏std::shared_ptr, std::unique_ptr, std::weak_ptr,三种智能指针类,可以自动管理内存使用示例智能指针对象,和一般的指针用法几乎完全相同#include <iostream>#include <memory> // 需要包含这个头文件int main(原创 2021-04-12 00:06:43 · 556 阅读 · 0 评论