加入收藏 | 设为首页 | 会员中心 | 我要投稿 衢州站长网 (https://www.0570zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

面试官:你看过Redis数据结构底层实现吗?

发布时间:2019-06-22 18:08:59 所属栏目:建站 来源:奔头哥
导读:副标题#e# 面试中,redis也是很受面试官亲睐的一部分。我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构。你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap、List、等使用的数据结构有什么区别呢。 1. 字符串处理(str

Hash表节点:

  1. typedef struct dictEntry {  
  2.     // 键  
  3.     void *key;  
  4.     // 值  
  5.     union {  
  6.         void *val;  
  7.         uint64_t u64;  
  8.         int64_t s64;  
  9.     } v;  
  10.     // 指向下个哈希表节点,形成链表  
  11.     struct dictEntry *next;  // 单链表结构  
  12. } dictEntry; 

字典:

  1. typedef struct dict {  
  2.     // 类型特定函数  
  3.     dictType *type;  
  4.     // 私有数据  
  5.     void *privdata;  
  6.     // 哈希表  
  7.     dictht ht[2];  
  8.     // rehash 索引  
  9.     // 当 rehash 不在进行时,值为 -1  
  10.     int rehashidx; /* rehashing not in progress if rehashidx == -1 */  
  11. } dict; 

可以看出:

  1.  Reids的Hash采用链地址法来处理冲突,然后它没有使用红黑树优化。
  2.  哈希表节点采用单链表结构。
  3.  rehash优化。

下面我们讲一下它的rehash优化。

3.2 rehash

当哈希表的键对泰国或者太少,就需要对哈希表的大小进行调整,redis是如何调整的呢?

  1.  我们仔细可以看到dict结构里有个字段dictht ht[2]代表有两个dictht数组。第一步就是为ht[1]哈希表分配空间,大小取决于ht[0]当前使用的情况。
  2.  将保存在ht[0]中的数据rehash(重新计算哈希值)到ht[1]上。
  3.  当ht[0]中所有键值对都迁移到ht[1]后,释放ht[0],将ht[1]设置为ht[0],并ht[1]初始化,为下一次rehash做准备。

3.3 渐进式rehash

我们在3.2中看到,redis处理rehash的流程,但是更细一点的讲,它如何进行数据迁的呢?

(编辑:衢州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读