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

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

发布时间:2019-06-23 04:44:00 所属栏目:编程 来源:奔头哥
导读:口试中,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

(编辑:湖南网)

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

热点阅读