加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2019-06-23 01:19:15 所属栏目:MySql教程 来源:奔头哥
导读:面试中,redis也是很受面试官亲睐的一部分。我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构。你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap、List、等使用的数据结构有什么区别呢。 1. 字符串处理(string) 我们

quicklist节点结构:

  1. typedef struct quicklistNode {  
  2.     struct quicklistNode *prev;     //前驱节点指针  
  3.     struct quicklistNode *next;     //后继节点指针  
  4.     //不设置压缩数据参数recompress时指向一个ziplist结构  
  5.     //设置压缩数据参数recompress指向quicklistLZF结构  
  6.     unsigned char *zl;  
  7.     //压缩列表ziplist的总长度 
  8.     unsigned int sz;                  /* ziplist size in bytes */  
  9.     //ziplist中包的节点数,占16 bits长度  
  10.     unsigned int count : 16;          /* count of items in ziplist */  
  11.     //表示是否采用了LZF压缩算法压缩quicklist节点,1表示压缩过,2表示没压缩,占2 bits长度  
  12.     unsigned int encoding : 2;        /* RAW==1 or LZF==2 */  
  13.     //表示一个quicklistNode节点是否采用ziplist结构保存数据,2表示压缩了,1表示没压缩,默认是2,占2bits长度  
  14.     unsigned int container : 2;       /* NONE==1 or ZIPLIST==2 */  
  15.     //标记quicklist节点的ziplist之前是否被解压缩过,占1bit长度  
  16.     //如果recompress为1,则等待被再次压缩  
  17.     unsigned int recompress : 1; /* was this node previous compressed? */  
  18.     //测试时使用  
  19.     unsigned int attempted_compress : 1; /* node can't compress; too small */  
  20.     //额外扩展位,占10bits长度  
  21.     unsigned int extra : 10; /* more bits to steal for future usage */  
  22. } quicklistNode; 

相关配置

在redis.conf中的ADVANCED CONFIG部分:

  1. list-max-ziplist-size -2  
  2. list-compress-depth 0 

list-max-ziplist-size参数

我们来详细解释一下list-max-ziplist-size这个参数的含义。它可以取正值,也可以取负值。

当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度。比如,当这个参数配置成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。

当取负值的时候,表示按照占用字节数来限定每个quicklist节点上的ziplist长度。这时,它只能取-1到-5这五个值,每个值含义如下:

-5: 每个quicklist节点上的ziplist大小不能超过64 Kb。(注:1kb => 1024 bytes)

-4: 每个quicklist节点上的ziplist大小不能超过32 Kb。

-3: 每个quicklist节点上的ziplist大小不能超过16 Kb。

-2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值)

list-compress-depth参数

这个参数表示一个quicklist两端不被压缩的节点个数。注:这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。

参数list-compress-depth的取值含义如下:

0: 是个特殊值,表示都不压缩。这是Redis的默认值。 1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。 2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。 3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。 依此类推…

Redis对于quicklist内部节点的压缩算法,采用的LZF——一种无损压缩算法。

【编辑推荐】

  1. 超详细的各种数据库默认驱动、URL、端口总结
  2. 一文了解各种数据库默认驱动、URL、端口
  3. 一次诡异的数据库“死锁”,问题究竟在哪里?
  4. Web端开源的多数据库支持管理工具,终于发现它了
  5. 分布式Redis的分布式锁Redlock
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:衡阳站长网)

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

热点阅读