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

Redis观念以及底层数据布局

发布时间:2019-04-18 12:21:45 所属栏目:编程 来源:佚名
导读:Redis 简介 REmote DIctionary Server(Redis) 是一个由SalvatoreSanfilippo写的key-value存储体系。 Redis是一个开源的行使ANSI C说话编写、遵守BSD协议、支持收集、可基于内存亦可耐久化的日记型、Key-Value数据库,并提供多种说话的API。 它凡是被称为数
副问题[/!--empirenews.page--]

Redis 简介

REmote DIctionary Server(Redis) 是一个由SalvatoreSanfilippo写的key-value存储体系。

Redis是一个开源的行使ANSI C说话编写、遵守BSD协议、支持收集、可基于内存亦可耐久化的日记型、Key-Value数据库,并提供多种说话的API。

它凡是被称为数据布局处事器,由于值(value)可所以字符串(String), 哈希(Map), 列表(list), 荟萃(sets) 和有序荟萃(sorted sets)等范例。

Redis特点

Redis 是完全开源免费的,遵守BSD协议,是一个高机能的key-value数据库。

Redis 与其他 key - value 缓存产物有以下三个特点:

  • Redis支持数据的耐久化,可以将内存中的数据保持在磁盘中,重启的时辰可以再次加载举办行使。
  • Redis不只仅支持简朴的key-value范例的数据,同时还提供list,set,zset,hash等数据布局的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

Redis 上风

机能极高 – Redis能读的速率是110000次/s,写的速率是81000次/s 。

富厚的数据范例 – Redis支持 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据范例操纵。

原子 – Redis的全部操纵都是原子性的,同时Redis还支持对几个操纵全并后的原子性执行。

富厚的特征 – Redis 还支持 publish/subscribe, 行列,key 逾期等等特征。

Redis工具范例简介

Redis是一种key/value型数据库,个中,每个key和value都是行使工具暗示的。

好比,我们执行以下代码:

  1. redis> SET message "hello redis" 

个中的key是message,是一个包括了字符串"message"的工具。而value是一个包括了"hello redis"的工具。

Redis共有五种工具的范例,别离是:

Redis中的一个工具的布局体暗示如下:

  1. typedef struct redisObject {  
  2. // 范例  
  3. unsigned type:4;  
  4. // 编码方法  
  5. unsigned encoding: 4;  
  6. // 引用计数  
  7. int refcount;  
  8. // 指向工具的值  
  9. void *ptr;  
  10. } robj;  

type暗示了该工具的工具范例,即上面五此中的一个。但为了进步存储服从与措施执行服从,每种工具的底层数据布局实现都也许不止一种。encoding就暗示了工具底层所行使的编码。

  • Redis工具底层数据布局
  • 字符串工具

字符串工具的编码可所以int、raw可能embstr

假如一个字符串的内容可以转换为long,那么该字符串就会被转换成为long范例,工具的ptr就会指向该long,而且工具范例也用int范例暗示。

平凡的字符串有两种,embstr和raw。embstr应该是Redis 3.0新增的数据布局,在2.8中是没有的。假如字符串工具的长度小于39字节,就用embstr工具。不然用传统的raw工具。

  1. #define REDIS_ENCODING_EMBSTR_SIZE_LIMIT 44  
  2. robj *createStringObject(char *ptr, size_t len) {  
  3. if (len <= REDIS_ENCODING_EMBSTR_SIZE_LIMIT)  
  4. return createEmbeddedStringObject(ptr,len);  
  5. else  
  6. return createRawStringObject(ptr,len);  
  7. }  

embstr的甜头有如下几点:

  1. embstr的建设只需分派一次内存,而raw为两次(一次为sds分派工具,另一次为objet分派工具,embstr省去了第一次)。
  2. 相对地,开释内存的次数也由两次变为一次。
  3. embstr的objet和sds放在一路,更好地操作缓存带来的上风。

raw和embstr的区别可以用下面两幅图所示:

Redis观念以及底层数据布局

  • 列表工具

列表工具的编码可所以ziplist可能linkedlist

  1. ziplist是一种压缩链表,它的甜头是更能节减内存空间,由于它所存储的内容都是在持续的内存地区傍边的。当列表工具元素不大,每个元素也不大的时辰,就回收ziplist存储但当数据量过大时就ziplist就不是那么好用了。由于为了担保他存储内容在内存中的持续性,插入的伟大度是O(N),即每次插入城市从头举办realloc。如下图所示,工具布局中ptr所指向的就是一个ziplist整个ziplist只必要malloc一次,它们在内存中是一块持续的地区。

linkedlist是一种双向链表。它的布局较量简朴,节点中存放pre和next两个指针,尚有节点相干的信息。当每增进一个node的时辰,就必要从头malloc一块内存。

  • 哈希工具

哈希工具的底层实现可所以ziplist可能hashtable。

ziplist中的哈希工具是凭证key1,value1,key2,value2这样的次序存放来存储的。当工具数量不多且内容不大时,这种方法服从是很高的。

(编辑:河北网)

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

热点阅读