在github上找到的一个最早的版本,1.30,这个版本里面已经加入了对很多不同类型的支持,还有一个自己管理内存的 VM,不过总体说来 Redis 的代码还是非常简单易懂的,这个系列不准备一行行的分析代码,就把 Redis 实现的亮点说一下吧。今天分析第一个亮点,Redis 虽然是使用 C 写的,但是其内部的构造其实是面向对象的。
typedef struct dict {
dictType *type;
void *privdata;
dictht ht[2];
int rehashidx; /* rehashing not in progress if rehashidx == -1 */
int iterators; /* number of iterators currently running */
} dict;
Redis 内部简单来说就是一个大哈希表,dict 就是装这个哈希表的地方。但是对于不同的类型的 哈希表哈希函数是不同的,key、value 的构造函数和析构函数肯定也是不一样的(Redis 支持 String、List、Set 的数据结构),但是从某个 key 找到对应值的这种哈希表的操作是相同的,如果每个类型都重新写一个哈希表的确是太烦了,这个问题使用 Java,C++ 等支持面向对象的语言很容易就解决了,比如写一个 dict 的抽象类,把 key,value的构造和析构函数以及哈希函数写成抽象接口,然后把查找这种函数利用抽象接口实现出来,然后再搞几个 StringDict子类、ListDict 子类来继承这个父类,问题就解决了。
但是 C 语言中没有继承和多态啊,这怎么办?
办法都是人想出来的,语言根