二、内存管理
1、前言
redis内存分配库支持jemalloc(Linux默认)、tcmalloc、libc(非Linux默认),编译方式参考Makefile。
三种内存分配方式的比较待以后总结——>?
2、adlist.h/adlist.c
基本数据结构是带头结点的双向链表(非循环),调用依赖zmalloc.h/zmalloc.c
typedef struct listIter { listNode *next; int direction; } listIter; typedef struct list { listNode *head; listNode *tail; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr, void *key); unsigned long len; } list;
list代表一个链表,dup/free/match代表对链表结点数据的操作函数,即对listNode中value的操作函数。dup代表对value的复制函数,free代表释放value内存的函数,match代表对value进行比较的函数。
listIter代表一个迭代器,正向或反向遍历链表。
3、zmalloc.h/zmalloc.c
附注:两次宏操作,可以防止一次宏未对s中使用的宏进行替换,如下所示(好久没看,忘记是不是这个意思了?)
#define __xstr(s) __str(s) #define __str(s) #s
主要是宏定义,运行效率高。实际运行依赖于所选择的内存分配库和操作系统平台。
未完待续。。。