您的位置:首页 > 数据库 > Redis

redis学习-字典

2014-10-28 16:34 183 查看
1.字典作用

实现数据库键空间(keyspace);

用作Hash类型键的底层实现之一;

2.字典实现的数据结构

typedefstructdict{

//特定于类型的处理函数
dictType*type;

//类型处理函数的私有数据
void*privdata;

//哈希表(2个)
dicththt[2];

//记录rehash进度的标志,值为-1表示rehash未进行
intrehashidx;

//当前正在运作的安全迭代器数量
intiterators;

}dict;

/*
*哈希表
*/
typedefstructdictht{

//哈希表节点指针数组(俗称桶,bucket)
dictEntry**table;

//指针数组的大小
unsignedlongsize;

//指针数组的长度掩码,用于计算索引值
unsignedlongsizemask;

//哈希表现有的节点数量
unsignedlongused;

}dictht;

/*
*哈希表节点
*/
typedefstructdictEntry{

//键
void*key;

//值
union{
void*val;
uint64_tu64;
int64_ts64;
}v;

//链往后继节点
structdictEntry*next;

}dictEntry;


3.Redis目前使用两种不同的哈希算法:



MurmurHash232bit算法:这种算法的分布率和速度都非常好,具体信息请参考MurmurHash的主页:http://code.google.com/p/smhasher/。

基于djb算法实现的一个大小写无关散列算法:具体信息请参考http://www.cse.yorku.ca/~oz/hash.html。


4.发生rehash的条件
  ratio=used/size


自然rehash:ratio>=1,且变量dict_can_resize为真。

强制rehash:ratio大于变量dict_force_resize_ratio(目前版本中,dict_force_resize_ratio的值为5)

5.rehash执行过程

创建一个比ht[0]->table更大的ht[1]->table;

将ht[0]->table中的所有键值对迁移到ht[1]->table;

将原有ht[0]的数据清空,并将ht[1]替换为新的ht[0];


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: