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

Redis为何这么快——数据存储角度

发布时间:2018-10-12 15:59:20 所属栏目:编程 来源:JAVA高级程序员
导读:【新产物上线啦】51CTO播客,随时随地,碎片化进修 本文内容思想导图如下: 一、简介和应用 Redis是一个由ANSI C说话编写,机能优越、支持收集、可耐久化的K-K内存数据库,并提供多种说话的API。它常用的范例首要是 String、List、Hash、Set、ZSet 这5种 Re

杜绝缓冲区溢出:行使C字符串的操纵时,假如字符串长度增进(如strcat操纵)而健忘从头分派内存,很轻易造成缓冲区的溢出;而SDS因为记录了长度,响应的操纵在也许造成缓冲区溢出时会自动从头分派内存,杜绝了缓冲区溢出。

四、List

List工具的底层实现是quicklist(快速列表,是ziplist 压缩列表 和linkedlist 双端链表 的组合)。Redis中的列表支持两头插入和弹出,并可以得到指定位置(或范畴)的元素,可以充当数组、行列、栈等。

  1. typedef struct listNode {  
  2.  // 前置节点  
  3.  struct listNode *prev;  
  4.  // 后置节点  
  5.  struct listNode *next;  
  6.  // 节点的值  
  7.  void *value;  
  8.  } listNode;  
  9.  typedef struct list {  
  10.  // 表头节点  
  11.  listNode *head;  
  12.  // 表尾节点  
  13.  listNode *tail;  
  14.  // 节点值复制函数  
  15.  void *(*dup)(void *ptr);  
  16.  // 节点值开释函数  
  17.  void (*free)(void *ptr);  
  18.  // 节点值比拟函数  
  19.  int (*match)(void *ptr, void *key);  
  20.  // 链表所包括的节点数目  
  21.  unsigned long len;  
  22.  } list; 
  •  rpush: listAddNodeHead ---O(1)
  •  lpush: listAddNodeTail ---O(1)
  •  push:listInsertNode ---O(1)
  •  index : listIndex ---O(N)
  •  pop:ListFirst/listLast ---O(1)
  •  llen:listLength ---O(N)

4.1 linkedlist(双端链表)

此布局较量像Java的LinkedList,有乐趣可以阅读一下源码。

Redis为何这么快——数据存储角度

从图中可以看出Redis的linkedlist双端链表有以下特征:节点带有prev、next指针、head指针和tail指针,获取前置节点、后置节点、表头节点和表尾节点的伟大度都是O(1)。len属性获取节点数目也为O(1)。

与双端链表对比,压缩列表可以节减内存空间,可是举办修改或增删操纵时,伟大度较高;因此当节点数目较少时,可以行使压缩列表;可是节点数目多时,照旧行使双端链表划算。

4.2 ziplist(压缩列表)

当一个列表键只包括少量列表项,且是小整数值或长度较量短的字符串时,那么redis就行使ziplist(压缩列表)来做列表键的底层实现。

Redis为何这么快——数据存储角度

ziplist是Redis为了节省内存而开拓的,是由一系列非凡编码的持续内存块(而不是像双端链表一样每个节点是指针)构成的次序型数据布局;详细布局相比拟力伟大,有乐趣读者可以看 Redis 哈希布局内存模子分解。在新版本中list链表行使 quicklist 取代了 ziplist和 linkedlist:

Redis为何这么快——数据存储角度

quickList 是 zipList 和 linkedList 的殽杂体。它将 linkedList 按段切分,每一段行使 zipList 来紧凑存储,多个 zipList 之间行使双向指针串接起来。由于链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节 (64bit 体系的指针是 8 个字节),其它每个节点的内存都是单独分派,会加剧内存的碎片化,影响内存打点服从。

Redis为何这么快——数据存储角度

quicklist 默认的压缩深度是 0,也就是不压缩。为了支持快速的 push/pop 操纵,quicklist 的首尾两个 ziplist 不压缩,此时深度就是 1。为了进一步节省空间,Redis 还会对 ziplist 举办压缩存储,行使 LZF 算法压缩。

五、Hash

Hash工具的底层实现可所以ziplist(压缩列表)可能hashtable(字典可能也叫哈希表)。

Redis为何这么快——数据存储角度

Hash工具只有同时满意下面两个前提时,才会行使ziplist(压缩列表):1.哈希中元素数目小于512个;2.哈希中全部键值对的键和值字符串长度都小于64字节。

(编辑:湖南网)

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

热点阅读