视频链接
内存分配
- zmalloc.h
- zmalloc.c
封装了 malloc
calloc
, realloc
三个申请内存和 free
释放内存的操作.
maxmemory
指令也要求redis需要统计使用了多少内存,这个统计就是基于malloc申请内存的大小进行了内存多少的计算。
在redis3.0版本中,对于内存使用量的计算是使用 锁
来解决并发问题,如下所示
pthread_mutex_t used_memory_mutex = PTHREAD_MUTEX_INITIALIZER;
#define update_zmalloc_stat_add(__n) do { \
pthread_mutex_lock(&used_memory_mutex); \
used_memory += (__n); \
pthread_mutex_unlock(&used_memory_mutex); \
} while(0)
在redis5.0版本中,对于内存使用量的计算则是使用 `cas` 来解决并发问题,如下所示
#define update_zmalloc_stat_alloc(__n) do { \
size_t _n = (__n); \
if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \
atomicIncr(used_memory,__n); \
} while(0)
#define atomicIncr(var,count) __atomic_add_fetch(&var,(count),__ATOMIC_RELAXED)
核心方法
- 分配内存
- zmalloc
- zcalloc
- zrealloc
- 释放内存
- zfree
- 拷贝C字符串 zstrdup
- 获取使用内存[原子获取]—zmalloc_used_memory