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

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

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

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

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

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

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

  • 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就会使用其他数据结构进行数据的存储。

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

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

  1. 向内存中连续存入数据_实例35_在Excel中按条件筛选数据并存入新的表

    老板想要看去年每月领料数量大于1000的数据.手动筛选并复制粘贴出来,需要重复操作12次,实在太麻烦了,还是让Python来做吧.磨刀不误砍柴工,先整理一下思路: 1. 读取原表,将数量大于1000的 ...

  2. 在jmeter中怎么提取数据_如何使用JMeter从文件中提取数据

    在性能测试方面,重用响应数据至关重要.几乎(如果不是全部!)负载测试场景假设您: 从先前的响应中提取有趣的方面,并在下一个请求中重用它们(也称为相关) 确保实际响应符合预期(又称断言) 因此,如果您是 ...

  3. 从hbitmap中获取位图数据_如何快速从主流数据库中获取人/小鼠数据?

    点击上方"蓝色字体"关注我们 鹿明 生物 蛋白.代谢组学服务专家 关注我们收获更多 关注 随着生物科技的迅速发展,每天都会有海量的生物学数据产生,如何有效的分析这些"生物 ...

  4. html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式

    从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列) 所以这篇 ...

  5. 如何评估数据适不适合放入Redis中?

    当项目中引入了 Redis 做分布式缓存,那么就会面临这样的问题: 哪些数据应该放到缓存中?依据是什么? 缓存数据是采用主动刷新还是过期自动失效? 如果采用过期自动失效,那么失效时间如何制定? 正好这 ...

  6. Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面

    Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录

  7. 在抽象类中可以没有抽象方法_是否可以在最终课程中使用抽象方法?

    在抽象类中可以没有抽象方法 这是最近在Java开发人员工作面试的电话面试中向我的一位读者提出的有趣的Java核心问题之一. 即使他知道你 无法用Java将抽象类定型为final ,他对方法的措辞感到困 ...

  8. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 1 2 3 4 5 6 ...

  9. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    本篇是基于云天之巅博主音视频开发中的一个bug,继而查阅了的一点资料:本篇转载自博客园某博主的随笔,并做极少量的修改,原文地址:https://www.cnblogs.com/haore147/p/3 ...

最新文章

  1. 全球物联网产业规模不断扩大 中国市场前景分析
  2. [NOI2010]能量采集
  3. 将php-fpm添加至service服务
  4. 插入排序Insertion sort 2
  5. 浅谈L0,L1,L2范数及其应用
  6. boost::::adaptors::indexed::indexed相关的测试程序
  7. 24小时制时间格式和12小时制时间格式
  8. A的大小是多少c语言中,C/C+中字符(A)的大小
  9. php 创建文本文件,php-创建文本文件以进行实时下载
  10. 关于MDI窗体的那些问题
  11. 光伏并网发电及低电压穿越技术
  12. 小学计算机说课稿,小学优秀信息技术说课稿
  13. 湖北大学知行学院考研计算机,我院2016届毕业生考研喜创佳绩
  14. scala2.11.8安装
  15. 羊是如何侵略狼的(看后很有感触)
  16. 从0开始安装k8s1.25【最新k8s版本——20220904】
  17. 国外类似VC的emule下载网站网址大全
  18. 优酷盗播引版权方围攻 视频大佬陷孤军奋战困局
  19. 数论:欧几里得与扩展欧几里得算法
  20. Perl脚本执行方法小结

热门文章

  1. linux里怎样压缩文件,如何在Linux中解压缩文件
  2. php umount强制,php foreach 參數強制類型轉換的問題 | 學步園
  3. 为什么搜索与推荐场景用AUC评价模型好坏?
  4. 技术动态 | 去中心化知识图谱协作平台建设实践
  5. 论文浅尝 - ICML2020 | 对比图神经网络解释器
  6. 会议交流 | DataFunCon 线上大会 - 知识图谱专题论坛
  7. 提供一个Android原生的Progress——SwipeToRefreshLayout下拉刷新时的等待动画
  8. 【HTML/CSS】HTML5和CSS3的新特性
  9. 这就是深度学习如此强大的原因
  10. Spring+SpringMVC+Mybatis项目—企业权限管理系统(2)