视频链接

点击查看【bilibili】

内存分配

  • zmalloc.h
  • zmalloc.c

封装了 malloc calloc , realloc 三个申请内存和 free 释放内存的操作.

maxmemory指令也要求redis需要统计使用了多少内存,这个统计就是基于malloc申请内存的大小进行了内存多少的计算。

在redis3.0版本中,对于内存使用量的计算是使用 来解决并发问题,如下所示

  1. pthread_mutex_t used_memory_mutex = PTHREAD_MUTEX_INITIALIZER;
  2. #define update_zmalloc_stat_add(__n) do { \
  3. pthread_mutex_lock(&used_memory_mutex); \
  4. used_memory += (__n); \
  5. pthread_mutex_unlock(&used_memory_mutex); \
  6. } while(0)
  1. redis5.0版本中,对于内存使用量的计算则是使用 `cas` 来解决并发问题,如下所示
  1. #define update_zmalloc_stat_alloc(__n) do { \
  2. size_t _n = (__n); \
  3. if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \
  4. atomicIncr(used_memory,__n); \
  5. } while(0)
  6. #define atomicIncr(var,count) __atomic_add_fetch(&var,(count),__ATOMIC_RELAXED)

核心方法

  • 分配内存
    • zmalloc
    • zcalloc
    • zrealloc
  • 释放内存
    • zfree
  • 拷贝C字符串 zstrdup
  • 获取使用内存[原子获取]—zmalloc_used_memory