给一片内存,用户层是没办法进行解引用的,因为不知道数据的类型。因此redis定义了对象类型,万物皆可定义成对象,将来再逆向读出来。
因此,对象就要至少知道内存布局,以及数据的地址,对象关注3个方面信息
很简单的一个比方,比如我要找一个地方存放123456789
这个东西,怎么放?
另一个场景,比如我要存放123
因此redisObject整合了一个总的入口,它仅仅是一个redis跟外界进行数据存储方式的信息传达,不专注底层的布局、编码实现,仅仅相当于一个门卫
1 UDT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 typedef struct redisObject { unsigned type:4 ; unsigned encoding:4 ; unsigned lru:LRU_BITS; int refcount; void *ptr; } robj;
2 创建对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 robj *createObject (int type, void *ptr) { robj *o = zmalloc(sizeof (*o)); o->type = type; o->encoding = OBJ_ENCODING_RAW; o->ptr = ptr; o->refcount = 1 ; if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) { o->lru = (LFUGetTimeInMinutes()<<8 ) | LFU_INIT_VAL; } else { o->lru = LRU_CLOCK(); } return o; }
3 数据类型 数据类型,常用的无非就是那么几种,语言无关性
3.1 字符串 3.1.1 raw型编码 1 2 3 4 5 6 7 8 9 10 11 12 13 robj *createRawStringObject (const char *ptr, size_t len) { return createObject(OBJ_STRING, sdsnewlen(ptr,len)); }
3.1.2 emb型编码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 robj *createEmbeddedStringObject (const char *ptr, size_t len) { robj *o = zmalloc(sizeof (robj)+sizeof (struct sdshdr8)+len+1 ); struct sdshdr8 *sh = (void *)(o+1 ); o->type = OBJ_STRING; o->encoding = OBJ_ENCODING_EMBSTR; o->ptr = sh+1 ; o->refcount = 1 ; if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) { o->lru = (LFUGetTimeInMinutes()<<8 ) | LFU_INIT_VAL; } else { o->lru = LRU_CLOCK(); } sh->len = len; sh->alloc = len; sh->flags = SDS_TYPE_8; if (ptr == SDS_NOINIT) sh->buf[len] = '\0' ; else if (ptr) { memcpy (sh->buf,ptr,len); sh->buf[len] = '\0' ; } else { memset (sh->buf,0 ,len+1 ); } return o; }
3.1.3 int型编码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 robj *createStringObjectFromLongLongWithOptions (long long value, int valueobj) { robj *o; if (server.maxmemory == 0 || !(server.maxmemory_policy & MAXMEMORY_FLAG_NO_SHARED_INTEGERS)) { valueobj = 0 ; } if (value >= 0 && value < OBJ_SHARED_INTEGERS && valueobj == 0 ) { incrRefCount(shared.integers[value]); o = shared.integers[value]; } else { if (value >= LONG_MIN && value <= LONG_MAX) { o = createObject(OBJ_STRING, NULL ); o->encoding = OBJ_ENCODING_INT; o->ptr = (void *)((long )value); } else { o = createObject(OBJ_STRING,sdsfromlonglong(value)); } } return o; }
3.2 链表 3.3 集合 3.4 有序集合 3.5 哈希表