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
}
(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