赞
踩
Redis内部使用两种结构来实现hash
Redis每次创建哈希类型的时候,都会先使用默认ziplist。
使用这种结构时,redisObject.encoding = OBJ_ENCODING_ZIPLIST
robj *createHashObject(void) {
unsigned char *zl = ziplistNew();
robj *o = createObject(OBJ_HASH, zl);
o->encoding = OBJ_ENCODING_ZIPLIST;
return o;
}
当ziplist不满足下面条件时,会自动转成哈希表
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
使用这种结构时,redisObject.encoding = OBJ_ENCODING_HT
先来简单介绍下hashtable用到的结构:
dict struct
typedef struct dict {
dictType *type;
void *privdata;
dictht ht[2];
long rehashidx;
unsigned long iterators;
} dict;
ht = dictIsRehashing(d) ? &d->ht[1] : &d->ht[0];
dictht struct
typedef struct dictht {
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
} dictht;
static void _dictReset(dictht *ht)
{
ht->table = NULL;
ht->size = 0;
ht->sizemask = 0;
ht->used = 0;
}
当插入节点大于空闲节点数时(size-used),就会对hashtable进行扩容,大概的步骤:
dictEntry struct
typedef struct dictEntry {
void *key;
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next;
} dictEntry;
上一篇:Redis学习小计(5) - 基本数据类型:列表(list)
下一篇:Redis学习小计(7) - 基本数据类型:集合(set)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。