为了账号安全,请及时绑定邮箱和手机立即绑定

redis hash 操作 需要实现 hashcode 吗?

redis hash 操作 需要实现 hashcode 吗?

繁华开满天机 2018-11-16 19:14:58
redis hash 操作 需要实现 hashcode 吗
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

redis的字典底层实现为hash表、

hash表由dict.h/dictht结构定义:

[cpp] view plain copy
typedef struts dictht{
//哈希表数组
dictEntry **table;
//哈希表数组
unsigned long size;
//哈希表大小掩码,用于计算索引值
//总是等于size-1
unsigned long sizemask;
//该hash表已有节点的数量
unsigned long used;
}dictth;
table属性是一个数组,每个元素指向一个 hash表节点的指针。

hash表节点的由dict.h/dictEntry结构定义

[cpp] view plain copy
<pre name="code" class="cpp">typedef struts dictEntry{
//键
void *key;
//值
union{
void *val;
uint64_tu64;
int64_ts64;
}
//指向下个hash表节点,形成链表
strut dictEntry *next;
}dictEntry;

键值对的值可以是指针,uint64_t整数,或者是int64_t整数。

next属性的作用是:如果多个键值对的hash值相同,它们会成为一个单向链表,来解决冲突。

redis中的字典由 dict.h/dict结构来定义

[cpp] view plain copy
typedef struts dict{
<pre name="code" class="cpp"><pre name="code" class="cpp"> //类型特定函数
dictType *type;
//私有数据
void *private;
//hash表
dictth ht[2]
//rehash索引
//当rehash不再进行的时候,值为-1
int trehashidx;
}dict;

type属性和private属性针对不同类型的键值对,用来创建多态字典。

dictType结构保存了一些用于操作键值对的函数,redis会为用途不同的字典设置不同的函数。
private保存了传给函数的 参数。
ht属性保存了两个hash表,通常情况下只使用一个hash表,另一个hash表用作复制。

查看完整回答
反对 回复 2018-12-13
  • 1 回答
  • 0 关注
  • 641 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信