elasticSearch Head插件操作
删除
修改"表"字段的值
redis中的数据结构
字典
可以理解为整个redis数据库就是一张大字典,对redis中某一个键值对的增删改查类似于操作字典中的一条记录,而字典是依赖哈希表实现的,哈希表三要素,散列函数,装填因子,冲突处理方法在字典中均有涉及,字典的数据结构主要由4部分构成,dict,dictht,dictEntry*[4],dictEntry
dictEntry*[4] 与 dictEntry 的结构说明采用的冲突处理方法是数据结构中的拉链法
typedef struct dictht {
// 哈希表数组
dictEntry **table;
// 哈希表大小
unsigned long size;
// 哈希表大小掩码,用于计算索引值
// 总是等于 size - 1
unsigned long sizemask;
// 该哈希表已有节点的数量
unsigned long used;
} dictht;
typedef struct dictEntry {
// 键
void *key;
// 值
union {
void *val;
uint64_t u64;
int64_t s64;
} v;
// 指向下个哈希表节点,形成链表
struct dictEntry *next;
} dictEntry;
dict中的dictType就是散列函数,它是为了创建多态的字典而设置的
装载因子是衡量散列表饱满程度的标准,当散列表中的饱满程度大于某个临界值,就会触发rehash,而ht[2] 与reHashIndex恰恰与此有关,redis的rehash不是单纯扩容原有hash表,而是有两个ht,一般只是用ht[0],ht[1]只有在rehash的时候才会用到。
Redis对字典的哈希表执行rehash的步骤如下:
- 为字典的ht[1]哈希表分配空间,这个空间大小取决于要执行的操作:
如果执行的是扩展操作,则ht[1]的大小为第一个大于等于等于ht[0].used*2的2^n;
如果执行的收缩操作,则ht[1]的大小为第一个大于等于ht[0].used的2^n; - 将保存在ht[0]中的所有键值对rehash到ht[1]上面:rehash指的是重新计算键的哈希值和索引值,然后将键值对放置到ht[1]的指定位置上
- 当ht[0]包含的所有键值对都迁移到ht[1]之后,释放ht[0],将ht[1]设置为ht[0],并在ht[1]新创建一个空白哈希表,为下一rehash做准备
而且这个reHash不是一蹴而就的,是渐进式的rehash,redis将rehash的过程分散到增删改查的过程中,使用rehashIndex表示当前reHash已经进行到ht[0]中的第几个元素了,让读写操作也能分担rehash的压力
typedef struct dict {
// 类型特定函数
dictType *type;
// 私有数据
void *privdata;
// 哈希表
dictht ht[2];
// rehash 索引
// 当 rehash 不在进行时,值为 -1
int rehashidx; /* rehashing not in progress if rehashidx == -1 */
} dict;