字典

2018-12-03  本文已影响2人  简书徐小耳

-字典又称为符号表,关联数组或者map

我对于 字典和链表等其他数据结构的关系的理解是
整个redis就是一个字典,key是string(SDS),value(可以是SDS,List,hash等)

字典的实现

dict.h文件的dictht就是hash表,里面的元素是:table(hash表数组),size(hash表大小),sizemask(hash表大小掩码,用于计算索引,总是等于size-1(就是类似于咱们的map总是是size-1 的二进制 这样的话 随机的概率好点)),used 已有的节点数量

哈希表节点

dictEntry 的结构如下:key, v(值),其中v可以是指针,或者unit64_t整数或者init64_t整数,next是指向下一个hash表节点的指针,该指针,是当有键值hash一样的时候进行存储。

字典是在dict.h文件中的dict结构

具体属性type,privdata(私有数据),dictht ht[2] 哈希表(2个主要类似GC中的surivor区,不过大小不是一样,只有有数据的才有大小), trehash(rehash索引,值=-1 代表没有rehash,主要是做渐进式rehash)

rehash 跟hashmap差不多(不仅包括扩展,还包括收缩)

rehas的时机

[BGSAVE]命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。

执行一个 AOF文件 重写操作。重写会创建一个当前 AOF 文件的体积优化版本。

即使 BGREWRITEAOF 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 BGREWRITEAOF 成功之前不会被修改。

重写操作只会在没有其他持久化工作在后台执行时被触发,也就是说:

从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, BGREWRITEAOF 仅仅用于手动触发重写操作。

渐进式rehash的步骤

上一篇 下一篇

猜你喜欢

热点阅读