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

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

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

这就涉及到了渐进式rehash,redis考虑到大量数据迁移带来的cpu繁忙(可能导致一段时间内停止服务),所以采用了渐进式rehash的方案。步骤如下:

  1.  为ht[1]分配空间,同时持有两个哈希表(一个空表、一个有数据)。
  2.  维持一个技术器rehashidx,初始值0。
  3.  每次对字典增删改查,会顺带将ht[0]中的数据迁移到ht[1],rehashidx++(注意:ht[0]中的数据是只减不增的)。
  4.  直到rehash操作完成,rehashidx值设为-1。

它的好处:采用分而治之的思想,将庞大的迁移工作量划分到每一次CURD中,避免了服务繁忙。

4. 跳跃表

这个数据结构是我面试中见过最多的,它其实特别简单。学过的人可能都知道,它和平衡树性能很相似,但为什么不用平衡树而用skipList呢?

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

4.1 skipList & AVL 之间的选择

  1.  从算法实现难度上来比较,skiplist比平衡树要简单得多。
  2.  平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速。
  3.  查找单个key,skiplist和平衡树的时间复杂度都为O(log n),大体相当。
  4.  在做范围查找的时候,平衡树比skiplist操作要复杂。
  5.  skiplist和各种平衡树(如AVL、红黑树等)的元素是有序排列的。

可以看到,skipList中的元素是有序的,所以跳跃表在redis中用在有序集合键、集群节点内部数据结构

4.2 源码

跳跃表节点:

  1. typedef struct zskiplistNode {  
  2.     // 后退指针  
  3.     struct zskiplistNode *backward;  
  4.     // 分值  
  5.     double score;  
  6.     // 成员对象  
  7.     robj *obj;  
  8.     // 层  
  9.     struct zskiplistLevel {  
  10.         // 前进指针  
  11.         struct zskiplistNode *forward;  
  12.         // 跨度  
  13.         unsigned int span;  
  14.     } level[];  
  15. } zskiplistNode; 

(编辑:衢州站长网)

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

推荐文章
    热点阅读