Redisが深く解析したデータ構造
Redis , (string object), 、 (list object)、 (hash object)、 (set object) (sorted set object) 。 。
一、単純な動的文字列
1、定義
Redis3.2 ,sds 5 ,5 。 sds.h ,
typedef char *sds;
//sdshdr5
struct __attribute__ ((__packed__)) sdshdr5 {
unsigned char flags; /* type, */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len; /* */
uint8_t alloc; /* , */
unsigned char flags; /* type, */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
uint16_t len;
uint16_t alloc;
unsigned char flags;
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
uint32_t len;
uint32_t alloc;
unsigned char flags;
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
uint64_t len;
uint64_t alloc;
unsigned char flags;
char buf[];
};
2、SDSとC言語文字列の区別と改善
2.1文字列長を取得する複雑さは定数レベル
C , O(N)。 SDS len。 , 。
2.2バッファオーバーフローの回避
C , , 。 SDS alloc , 。 ,SDS 。
2.3文字列変更時のメモリ再割り当て回数を減らす
C 。SDS 、 。 。
2.4バイナリセキュリティ
C , , 、 。Redis buf , 。SDS len , 。
二、チェーン時計
1、定義
, Redis , 、 、 、 , 。 adlist.h , :
//
typedef struct listNode {
//
struct listNode *prev;
//
struct listNode *next;
//
void *value;
} listNode;
//
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;
2、Redisチェーンテーブルの特性
: prev next , O(1)。
: prev next NULL, NULL 。
: list head tail , O(1)。
: list len list , O(1)。
: void* , list dup、free、match , 。
三、辞書
, (symbol table)、 (associative array) (map), (key-value pair) 。
Redis , Redis , 、 、 、 。 , , , ,Redis 。
1、定義
Redis , , 。 dict.h , :
1.1、ハッシュテーブルノード
//
typedef struct dictEntry {
//
void *key;
//
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
//
struct dictEntry *next;
} dictEntry;
key , v , , uint64_t , int64_t 。next , , (collision) 。
1.2型特定関数
//
typedef struct dictType {
//
uint64_t (*hashFunction)(const void *key);
//
void *(*keyDup)(void *privdata, const void *key);
//
void *(*valDup)(void *privdata, const void *obj);
//
int (*keyCompare)(void *privdata, const void *key1, const void *key2);
//
void (*keyDestructor)(void *privdata, void *key);
//
void (*valDestructor)(void *privdata, void *obj);
} dictType;
dictType ,Redis 。
1.3ハッシュ表
//
typedef struct dictht {
//
dictEntry **table;
//
unsigned long size;
// , size-1,
unsigned long sizemask;
//
unsigned long used;
} dictht;
1.4辞書
//Redis
typedef struct dict {
// , dictType
dictType *type;
//
void *privdata;
//
dictht ht[2];
//rehash , rehash , -1
long rehashidx; /* rehashing not in progress if rehashidx == -1 */
//
unsigned long iterators; /* number of iterators currently running */
} dict;
type privdata , :
type dictType , dictType ,Redis 。
privdata 。
1.5辞書の反復器
// 1 , dictAdd, dictFind 。
// , dictNext()
typedef struct dictIterator {
dict *d;
long index;
int table, safe;
dictEntry *entry, *nextEntry;
// fingerprint
long long fingerprint;
} dictIterator;
ハッシュアルゴリズム