Redis源码分析-基础功能(内存)

Redis简介:

Redis是一个高性能key-value存储系统,有以下几个优点:

1.支持数据持久化,可以将内存中的数据保存到磁盘中,重启的时候重新加载使用。

2.Redis支持简单的字符串的key-value ,并且支持比较复杂的存储结构,例如list,set,zset, hash等。

3.Redis支持master-slave模式的数据备份机制。

4.Redis的性能极高,快速读写,如果把redis和客户端放在同一台机

器上,忽略网络带宽的影响,一般达到60000次/s的读写或更高,取决于机器性能。

5.Redis所有的操作都是原子操作。

6.Redis支持pub/sub模式。

7.代码简短,易于读取。


Redis源码阅读顺序摘自:《如何阅读 Redis 源码?》(黄建宏老师)

Redis列表如下:


基础数据结构分析:

阅读代码的文件如下:

(1).内存分配 zmalloc.c和zmalloc.h 。

(2).动态字符串 sds.h和sds.c 。

(3).双端链表 adlist.c和adlist.h。

(4).字典 dict.h和dict.c 。

(5).跳跃表 server.h文件里面关于zskiplist结构和zskiplistNode结构,以及t_zset.c中所有zsl开头的函数,比如 zslCreate、zslInsert、zslDeleteNode等等。 

(6).日志类型 hyperloglog.c 中的 hllhdr 结构, 以及所有以 hll 开头的函数。

源码分析:

(1).内存分配

Redis有自己管理内存的方式,这样做可以利用内存池等方式提高内存分配的性能,掌控更多的内存信息,以便在虚拟内存管理是明确何时将内存swap到磁盘上。

zmalloc(),Redis申请内存的过程除了要申请需要的size外还要申请PREFIX_SIZE,用来记录申请内存块的长度,如果申请成功,会用宏函数

update_zmalloc_stat_alloc(size+PREFIX_SIZE, size)记录申请的内存块的相关信息,以便监测内存块的使用情况。当内存块被zfree()释放掉,

根据头部的信息可以快速的知道被释放的内存块的长度,然后通过宏函数update_zmalloc_stat_free()标记释放。

void *zmalloc(size_t size) {
    void *ptr = malloc(size+PREFIX_SIZE);

    if (!ptr) zmalloc_oom_handler(size);
#ifdef HAVE_MALLOC_SIZE
    update_zmalloc_stat_alloc(zmalloc_size(ptr));
    return ptr;
#else
    *((size_t*)ptr) = size;
    update_zmalloc_stat_alloc(size+PREFIX_SIZE);
    return (char*)ptr+PREFIX_SIZE;
#endif
}

宏update_zmalloc_stat_alloc()中,首先将要分配的空间与内存对齐,然后会根据宏zmalloc_thread_safe判断是否需要对         内存信息记录表的相关操作加锁。虽然Redis在大部分场景中是单线程读写的,即thread_safe的,但启用虚拟内存(VM),或       持久化dump到磁盘等操作时会启动多线程,因此在多线程模式中,需要对部分操作加锁。

        (2).内存监控

             Redis中的used_memory记录了redis使用的内存数,而多线程下malloc()是线程安全的,zmalloc_allocations[]记录了各个size分配的内存块数,大于256的按照256算。应用程序可以通过zmalloc_allocations_for_size(size)获得对应size的内存块的分配数目;也可以通过zmalloc_used_memory()获得Redis占用的总内存。这些监控类的方法在Redis的日志系统中被用到。除了内存相关的操作外,Redis还提供了一个复制字符串的方法zstrdup(char  *),该方法将申请一块与源字符串长度相同的内存区域,并用memcpy()拷贝字符串的内。

参考:《Redis源码分析》,https://www.cnblogs.com/aixiaomei/p/6311633.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值