向内存中连续存入数据_内存节省到极致!Redis中这个数据结构,值得每个程序员了解...

在之前我们介绍了,Redis有五种基础数据类型,分别是String,Set,List,Hash与SortSet。

eb98aefc4e7a2e3a516c7d140999a376.png

今天我们又学习了一个命令,我们可以使用DEBUG OBJECT key查询Redis中,存储数据的一些关键信息,如下所示:

22bd4fad45e2442d57b6d33b2f1f167d.png

我们发现了ziplist跟intset这两种不在上述基础类型的数据结构,这又是什么呢?

Redis为了节省内存空间,当Hash与Zset元素个数较少的时候,会使用ziplist进行存储,也就是压缩表。在压缩表中,元素紧密排列,更加节省内存。今天,我们一起来探讨ziplist的内部,看一看ziplist的实现。

956c13dd0be913160b30458e4826fb94.png
  • 数据结构Zlist是有上述元素构成:zlbytes 记录着整一个压缩表的长度
  • zltail 记录着最后一个元素的偏移量,这是为了倒序遍历整个zlist
  • zlen 用来记录压缩表中节点的数量
  • entryX 列表中的节点,节点用来存储具体的数据,厂部补丁。
  • zlend 一个特殊值0XFF,用来标记压缩列表已经结束了。
d932ce7780db86e32096f3fc98c0a137.png

我们注意到,在Redis中,数据结构压缩表是紧凑排列的,所以,我们每次查询都需要遍历整一个列表,才能查询到相关数据,因为ziplist存放的个数非常有限,所以性能的开销并不大。

接下来,我们来看一看Redis的压缩表中,节点的构成。

b48f83e1e9f7f952317e66534d10e32a.png
  • prevlen 用来记录上一个节点的长度,因为压缩表可能需要倒序遍历,所以需要记录prevlen才能够定位出上一个entry的位置。
  • encoding 在Redis的压缩表中,设计精髓都在这里,为了节省压缩表占用的内存,Redis对Encoding进行了极致的设计。一般都是读取前8个字节,用来判断存储的数据是什么。举个简单的例子,如果前8个字节是00xxxxxx,这里的00开头,表示的是这是个非常短的字符串,后面的6个x表示字符串的长度,2^6-1等于63,所以,这个数据就encoding就表示,content是一个非常短的字符串,长度最多为63位。另一个例子,如果前8个字节是11111110,那么这个表示是int8,后面跟一个字节用来表示整数。
  • content 用来存放具体的数据,前面已经提到了,是用来存放具体的数据。

根据上述规则,假如我们存放的数据是"hello world",那么Redis用来保存这个数据Entry如下所示,prevlen用来保存上一个Entry的长度,跟本数据无关,因为是小字符串,所以encoding为00001011,1011表示长度为11,content则为长度为11的字符串helloworld。

最后,我们再来了解下连锁更新,如同数据结构中数组插入元素时间复杂度为O(N)一样,在Redis的数据结构压缩表中,插入数据也会一样,并且插入数据还可能会引起连锁更新,因为每个Entry都会记录上一个Entry的长度,所以,在插入一定数量的Entry之后,Redis就会使用其他数据结构进行数据的存储。

fdaef73cff46ea01b3b43ab2c5a4d00d.png

好了,有关Redis压缩表我们就介绍到这里。欢迎大家关注我,近期还准备了一些AI相关的知识,整理后会和大家继续分享。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能的缺憾

来源: 人机与认知实验室按:对于人工智能的发展最近一直有一些思考,抽空整理下来,算是抛砖引玉吧。欢迎指教讨论。人工智能的崭新范式人工智能的研究范式和数理科学截然不同。这种范式数据导向,非常工程化,方…

python编程环境安装包_Python环境安装与配置

第二天-Python环境境安装及简单程序的编写 一.Python的安装 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择适合自己操作系统的版本进行下载。2.下载完成后如…

Scala初体验

因为工作中要用到Scala了,本来前面自己还在学习Storm的,没有办法,先把Scala和Spark的这些内容学完在回去看Storm吧! 既然我们要学习Scala,那么我们不禁的要问了,什么是Scala? Scala是一种多范式…

NEBULA超级计算机,科学网—中国“星云”或将称霸全球超级计算机500强

中国“星云”或将称霸全球超级计算机500强曙光“星云”高性能计算机系统美国橡树岭国家实验室的“美洲虎”(Jaguar)北京时间8月2日晚间消息,据国外媒体报道,全球超级计算机500强排名今年11月将进行更新,而中国的超级计算机“星云”(Nebulae)届…

全球43亿IPv4地址正式耗尽,IPv6才是物联网的菜

来源:鲜枣课堂、财经杂志、CSDN物联网智库 整理发布导 读负责英国、欧洲、中东和部分亚洲地区互联网资源分配的欧洲网络协调中心(RIPE NCC)昨日宣布,其已从可用地址池中完成了最后IPv4地址的分配,这意味全球所有43亿个…

nmap地址段下的ip_安服福音——花式nmap扫描整理结果(文末重磅消息)

0x01应用背景安全服务的工作,日常扫扫扫、日常的工作一次性让人扫描多个网段,经验充足的老师傅会使用xml转excel,但是新入门的安服小伙伴们,是否也经历过一段手工一个个整理的时期呢,我是的。后来,随着需求…

getter方法的作用 vuex_Vuex的工作流程

Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。vuex有哪几种…

从生态、业绩角度分析芯片行业

来源:国信证券生态角度:合作伙伴、底层架构、高级人才、EDA 软件技术的发展是从点到面,逐渐复杂。产业的发展也是从单一点突破,最后形成上下游产业链。伴随着技术变复杂和产业链延伸,市场形成稳定的生态结构&#xff0…

tensorflow计算网络占用内存_详细图解神经网络梯度下降法(tensorflow计算梯度)...

1.什么是梯度各个方向的偏微分组成的向量​ 举例说明,z对x的偏微分和对y的偏微分如下,则梯度是(-2x,2y)的这样一个向量​ 在光滑连续函数的每个点上,都可以计算一个梯度,也就是一个向量&#xf…

关于数据中台系统,需要了解哪些技术?

来源:国家建材大数据研究中心今天让我们全面解读中台,包括企业为什么要平台化,目前中台都有哪些形式,实施中台系统的优势、面临的问题以及建议都有哪些?中台这个概念早期是由美军的作战体系演化而来的,技术…

python for循环连续输入五个成绩判断等级_Python条件循环判断

1.条件判断语句 Python中条件选择语句的关键字为:if 、elif 、else这三个。其基本形式如下: 1 2 3 4 5 6 7 8 9 age_of_cc 27 age int(input("guessage:")) if age age_of_cc: print("Yes,you got it!") elif age > age_of_cc: p…

人工智能的下半场,一定少不了自监督学习

来源:AI科技评论作者 | Lilian Wang 王荔编译 | MrBear对于给定的任务,在拥有足够的标签的情况下,监督式学习可以很好地解决该问题。想要得到好的性能,往往需要大量的数据标签,但是手动收集数据的成本很高(…

bert 多义词_BERT之后,GLUE基准升级为SuperGLUE:难度更大

选自Medium作者:Alex Wang等机器之心编译参与:PandaBERT 等模型的进展已让 GLUE 基准在新模型的评估方面日渐乏力,为推动 NLP 技术的进一步发展,有必要对 GLUE 指标进行更新。为此,纽约大学、Facebook 人工智能研究所、…

thread.sleep是让哪个线程休眠_Java多线程:多线程基础知识

点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章本文来源:https://www.cnblogs.com/ITtangtang/p/7602363.html一、线程安全性定义:多个线程之间的操作无论采用何种执行时序或交替方式,都要保证不变性条件不被破…

整个领域没了!学术界有史以来最大的丑闻

来源:中大科技处10月15日,学术界发生了一件大事。哈佛终身教授学术造假,31篇文献被撤,无数研究化为泡影……哈佛一次性从各类顶尖期刊上撤稿了31篇论文,整个心肌干细胞相关的研究被认定为“从一开始就基于欺诈性数据”…

thinkPHP-空操作

空操作 当访问的方法不存在时&#xff0c;可以定义一个empty方法来避免空操作 function _empty(){echo "网页不存在&#xff0c;请检查地址信息";} 这样当访问不存在的方法时就会显示以上信息 当访问的控制器不存在时&#xff0c;可以定义一个空操作器 <?php nam…

python3 面向对象_Python3 面向对象

Python和C都是一门面向对象的语言&#xff0c; 面向对象技术简介 类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。比如 f file()##创建了一个类(file())的对象f 类变量&#xff1a;类变量在整个实例的对象…

口腔ct重建服务器原理,牙科CT是什么?牙科CT的原理及优势介绍

原标题&#xff1a;牙科CT是什么&#xff1f;牙科CT的原理及优势介绍牙科CT是什么&#xff1f;牙科CT&#xff0c;又称口腔CT&#xff0c;是一种新型牙科类仪器&#xff0c;它可以从三维角度对口腔部组织情况进行扫描检查。牙科CT在业界被誉为神奇的“慧眼”&#xff0c;它犹如…

机器学习奠基人Michael Jordan:下代技术是融合经济学,解读2项重要进展

来源&#xff1a; 北京智源人工智能研究院2019年11月1日北京智源大会全体大会及闭幕式上&#xff0c;被誉为“机器学习之父”的加州大学伯克利教授、智源研究院学术顾问委员会委员 Michael I.Jordan 做了题为《决策与情境&#xff1a;基于梯度的博弈均衡求解方法》&#xff08;…