标签:
还有两个多月就找工作了,决定把之前看的一些东西整理一下,做个记录,也整理一下最近的思路。typedef char *sds;
/*下面是sds数据结构的具体实现*//* Note: sdshdr5 is never used, we just access the flags byte directly.* However is here to document the layout of type 5 SDS strings. */struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[];};struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* used */uint16_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};struct __attribute__ ((__packed__)) sdshdr32 {uint32_t len; /* used */uint32_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};struct __attribute__ ((__packed__)) sdshdr64 {uint64_t len; /* used */uint64_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};

#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))
static inline size_t sdslen(const sds s) {unsigned char flags = s[-1];switch(flags&SDS_TYPE_MASK) {case SDS_TYPE_5:return SDS_TYPE_5_LEN(flags);case SDS_TYPE_8:return SDS_HDR(8,s)->len;case SDS_TYPE_16:return SDS_HDR(16,s)->len;case SDS_TYPE_32:return SDS_HDR(32,s)->len;case SDS_TYPE_64:return SDS_HDR(64,s)->len;}return 0;}
typedef struct listNode { /*节点*/struct listNode *prev;struct listNode *next;void *value; /*value用函数指针类型,决定了value可以是sds,list,set,dict等类型*/} listNode;
typedef struct list { /*链表结构*/listNode *head; /*头节点*/listNode *tail; /*尾节点*//*类似java类里的的方法,方便调用*/void *(*dup)(void *ptr); /*复制节点*/ //说实话,我不是很懂这个函数指针的意思,如有清楚地可以给我留言,谢谢。void (*free)(void *ptr); /*释放节点*/int (*match)(void *ptr, void *key); /*匹配节点,返回key值得index,但是我不清楚他在那里实现的*/unsigned long len; /*记录链表的长度*/} list;

typedef struct listIter {listNode *next;int direction; //标注迭代器的运行方向} listIter;
typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next;} dictEntry;
typedef struct dictht {dictEntry **table;unsigned long size;unsigned long sizemask; /*hash表的掩码,总是size-1,用于计算hash表的索引值*/unsigned long used;} dictht;
typedef struct dict {dictType *type;void *privdata;dictht ht[2];long rehashidx; /* rehashing not in progress if rehashidx == -1 */int iterators; /* number of iterators currently running */} dict;

typedef struct intset { /*整数集合的数据结构*/uint32_t encoding; //编码方式uint32_t length;int8_t contents[];} intset;

typedef struct zskiplistNode {robj *obj; //存储对象的指针double score; //分数struct zskiplistNode *backward; //后退指针,每次只能退一步struct zskiplistLevel {struct zskiplistNode *forward; //前进指针,每次可以跳跃好几步unsigned int span; //这个就是决定前进指针能跳跃几步的跨度标志} level[];} zskiplistNode;
typedef struct zskiplist {struct zskiplistNode *header, *tail;unsigned long length;int level;} zskiplist;

int zslRandomLevel(void) {int level = 1;while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))level += 1;return (level<ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL;}
typedef struct zlentry {//prevrawlen为上一个数据结点的长度,prevrawlensize为记录该长度数值所需要的字节数unsigned int prevrawlensize, prevrawlen;//len为当前数据结点的长度,lensize表示表示当前长度表示所需的字节数unsigned int lensize, len;//数据结点的头部信息长度的字节数unsigned int headersize;//编码的方式unsigned char encoding;//数据结点的数据(已包含头部等信息),以字符串形式保存unsigned char *p;} zlentry;


标签:
原文地址:http://blog.csdn.net/a6833916180/article/details/51596013