Redis常用数据类型的数据结构

文章目录

    • 1. Redis 数据库介绍
    • 2. 列表(list)
    • 3. 字典(hash)
    • 4. 集合(set)
    • 5. 有序集合(sortedset)
    • 6. 数据结构持久化
    • 7. 总结

1. Redis 数据库介绍

Redis 是一种键值Key-Value )数据库。相对于关系型数据库(比如MySQL),Redis也被叫作 非关系型 数据库。

  • 像MySQL 这样的关系型数据库,表的结构比较复杂,会包含很多字段,可以通过SQL语句,来实现非常复杂的查询需求。
  • 而Redis中只包含“键”和“值”两部分,只能通过“键”来查询“值"。正是因为这样简单的存储结构,让Redis的读写效率非常高
  • Redis 主要是作为内存数据库来使用,数据是存储在内存中的。它也支持将数据存储在硬盘中。

Redis中,的数据类型是字符串的数据类型有很多,常用的分别是字符串列表字典集合有序集合

“字符串(string)"这种数据类型非常简单,对应到数据结构里,就是字符串。

2. 列表(list)

列表这种数据类型支持存储一组数据。其对应两种实现,一种是压缩列表(ziplist),另一种是双向循环链表

  • 列表中数据量比较小的时候,就可以采用压缩列表的方式实现。具体需要同时满足下面两个条件:
  1. 列表中保存的单个数据(有可能是字符串类型的)小于64字节;
  2. 列表中数据个数少于512个。

压缩列表,并不是基础数据结构,是Redis自己设计的一种数据存储结构。它有点类似数组,通过一片连续的内存,来存储数据。它跟数组不同的一点是,它允许存储的 数据大小不同 。存储结构如图。
在这里插入图片描述
压缩列表中的“压缩”如何理解?

  • 节省内存,是相较于数组而言的。数组要求每个元素的大小相同,如果我们要存储不同长度的字符串,就需要用最大长度的字符串大小作为元素的大小(假设是20个字节)。当我们存储小于20个字节长度的字符串的时候,便会浪费部分存储空间。如图。
    在这里插入图片描述

  • 支持不同类型数据的存储。因为数据存储在一片连续的内存空间,通过键来获取值为列表类型的数据,读取的效率也非常高。

  • 列表中数据量比较大的时候,也就不能同时满足刚刚讲的两个条件,列表就要通过双向循环链表来实现。

Redis的双向链表实现方式,非常值得借鉴。它额外定义一个list结构体,来组织链表的首、尾指针,还有长度等信息。在使用的时候非常方便。

// 以下是 C 语言代码,因为 Redis 是用 C 语言实现的。
typedef struct listnode 
{struct listNode *prev;struct listNode *next;void *value;
} listNode;typedef struct list 
{listNode *head;listNode *tail;unsigned long len;// .... 省略其他定义
} list;

3. 字典(hash)

字典类型用来存储一组数据对。每个数据对又包含键值两部分。字典类型也有两种实现方式

  • 一种是压缩列表,另一种是散列表

同样,当存储数据量比较小的情况下,Redis 才使用压缩列表来实现字典类型。需要满足两个条件:

  • 字典中保存的的大小都要小于64字节
  • 字典中键值对个数要小于512个

不能同时满足上面两个条件,Redis 就使用散列表来实现字典类型。

  • Redis使用 MurmurHash2 这种运行速度快、随机性好的哈希算法作为哈希函数。对于哈希冲突,Redis 使用链表法来解决。

  • Redis还支持散列表的动态扩容缩容。当装载因子 >1 时,Redis会触发扩容,将散列表扩大为原来的2倍左右(具体值需要计算得到,感兴趣,可以阅读源码)。

  • 当装载因子 < 0.1 的时候,Redis 就会触发缩容,缩小为字典中数据个数的大约2倍(这个值也是计算得到的)。

扩容缩容要做大量的数据搬移和哈希值的重新计算,所以比较耗时。Redis 使用渐进式扩容缩容策略,将数据搬移分批进行避免大量数据一次性搬移导致的服务停顿

4. 集合(set)

集合用来存储一组不重复的数据。有两种实现方法,一是基于有序数组,另一种基于散列表

  • 当要存储的数据,同时满足下面这样两个条件的时候,Redis 就采用有序数组,来实现集合。
  1. 存储的数据都是整数
  2. 存储的数据元素个数不超过512个
  • 不能同时满足这两个条件时,Redis 使用散列表来存储集合中的数据。

5. 有序集合(sortedset)

有序集合用来存储一组数据,并且每个数据会附带一个得分。通过得分大小,将数据组织成跳表这样的数据结构,以支持快速地按照得分值得分区间获取数据。

数据量比较小时,Redis会用压缩列表来实现有序集合。前提有两个:

  1. 所有数据的大小 小于64字节
  2. 元素个数要小于128个

6. 数据结构持久化

尽管Redis经常会被用作内存数据库,但它也支持数据落盘,当机器断电时,存储在Redis中的数据不会丢。重启后,Redis 只需再将存储在硬盘中的数据,重新读到内存,就可以继续工作了。

持久化”,可以笼统地可以理解为“存储到磁盘"。如何持久化到硬盘?

  1. 清除原有的存储结构只将数据存到磁盘。当需要从磁盘还原数据到内存时,再重新将数据组织成原来的数据结构。Redis采用的就是这种持久化思路。
    这种方式也有一定的弊端。那就是数据从硬盘还原到内存的过程,会耗用较多时间
    比如,将散列表中的数据存储到磁盘。当我们从磁盘中,取出数据重新构建散列表的时候,需要重新计算每个数据的哈希值。
  2. 保留原来的存储格式按照原有的格式存储在磁盘中。拿散列表来举例。可以将散列表的大小、每个数据被散列到的槽的编号等信息,都保存在磁盘中。有了这些信息,从磁盘还原到内存的时候,就可以避免重新计算哈希值。

7. 总结

压缩列表(可以看作一种特殊的数组)、有序数组、链表、散列表、跳表。实际上,Redis就是这些常用数据结构的封装。

夯实基础很重要。基础很好,不但能知其然,还能知其所以然,从而真正理解Redis作者设计的动机。不但能有助于我们理解所用的开源软件,还能为我们自己创新添砖加瓦。

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

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

相关文章

论文浅尝 | 使用循环神经网络的联合事件抽取

余博涛&#xff0c;南京大学计算机科学与技术系&#xff0c;硕士研究生论文连接&#xff1a;http://www.aclweb.org/anthology/N16-1034发表会议&#xff1a;NAACL-HLT 2016摘要事件抽取&#xff08;event extraction&#xff09;是信息抽取中一个特别具有挑战性的问题。针对该…

阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结

web前端性能优化 Web前端指网站业务逻辑之前的部分&#xff0c;包括&#xff1a; 1.浏览器加载 2.网站视图模型 3.图片服务 4.CDN服务等 主要优化手段有优化浏览器访问&#xff0c;使用反向代理&#xff0c;CDN等。 1.浏览器访问优化 &#xff08;1&#xff09;减少http…

动手做个DialoGPT:生成式多轮对话模型

文 | 苏剑林编 | 兔子酱前段时间刷Arixv的时候&#xff0c;发现清华大学开源了一个大规模的中文闲聊语料库LCCC&#xff0c;从开源的文件上来看&#xff0c;这可能是目前开源的数量最大、质量最好的闲聊语料库了&#xff0c;而且还包含了部分多轮对话聊天&#xff0c;总的来说可…

搜索引擎背后的数据结构和算法

文章目录1. 整体系统介绍2. 搜集2.1 待爬取网页链接文件&#xff1a;links.bin2.2 网页判重文件&#xff1a;bloom_filter.bin2.3 原始网页存储文件&#xff1a;doc_raw.bin2.4 网页链接及其编号的对应文件&#xff1a;doc_id.bin3. 分析3.1 抽取网页文本信息3.2 分词并创建临时…

论文浅尝 | DKN: 面向新闻推荐的深度知识感知网络

笔记整理&#xff1a;仲亮靓&#xff0c;东南大学硕士研究生&#xff0c;研究方向是基于知识图谱的推荐系统动机新闻文本的语言非常凝练&#xff0c;其中包含了很多实体和常识知识。但目前的新闻个性化推荐方法都没有利用这些外部知识&#xff0c;也没有使用新闻之间潜在的知识…

聊聊工业界做机器学习的里程碑

文 | 吴海波编 | YY阅读说明&#xff0c;本文的机器学习领域限制于互联网搜索、推荐、广告场景&#xff0c;仅限于个人观点。2017年&#xff0c;我和团队的几个核心去了趟北京&#xff0c;找了各大互联网公司一线实战的同学&#xff0c;交流各自在机器学习上的经验。这次交流让…

直通BAT JVM必考题:Minor GC、Major GC、Full GC的区别

Java面试过程&#xff0c;JVM属于必考题系列&#xff1a; 直通BAT必考题系列&#xff1a;深入详解JVM内存模型与JVM参数详细配置 直通BAT必考题系列&#xff1a;JVM的4种垃圾回收算法、垃圾回收机制与总结 直通BAT必考题系列&#xff1a;7种JVM垃圾收集器特点&#xff0c;优…

matplotlib绘制多张图、多子图、多例图

绘制多图 关键&#xff1a; fig plt.figure(1) 表示新建第几个图 import matplotlib.pyplot as pltfig plt.figure(1) plt_rec_loss [1,2,3,4,5,6] plt_rec_recall [4,3,6,5,8,9] plt.xlabel("epoch") plt.ylabel("loss") plt.plot(range(len(plt_re…

jieba分词并做分析

Github&#xff1a;结巴分词地址 https://github.com/fxsjy/jieba 几种分词方法的简单使用&#xff1a;一 . jieba安装、示例 pip install jieba&#xff0c;jieba分词的语料是基于人民日报。分词示例1 import jieba 2 3 str1 江州市长江大桥 4 word_object jieba.cut(s…

研讨会 | CCF TF 第 17 期:认知计算产业化落地

CCF TF 技术前线只为技术专家CCFTF第17期主题 认知计算产业化落地2019年05月11日上海斯波特酒店五楼&#xff08;上海市南丹路15号&#xff0c;徐汇区政府对面&#xff09;人类迈入人工智能时代&#xff0c;技术的发展使得机器可以从大数据中提取信息&#xff0c;串联成知识&a…

短网址系统

文章目录1. 短网址服务整体介绍2. 如何通过哈希算法生成短网址&#xff1f;2.1 如何让短网址更短2.2 如何解决哈希冲突&#xff1f;2.3 如何优化哈希算法生成短网址的性能&#xff1f;3. 如何通过ID生成器生成短网址&#xff1f;3.1 相同的原始网址可能会对应不同的短网址3.2 如…

一个神经元的价值和一个神经病的坚持

作者 | 周博磊来源 | 机器之心一个神经元能够催生多少故事&#xff1f;香港中文大学信息工程系助理教授周博磊近日撰文介绍了他自 2015 年开始至今对神经元的研究经历。最近&#xff0c;他与 David Bau、朱俊彦等人合作的神经元研究论文发表在了 PNAS 杂志上。以下是周博磊的原…

直通BAT必考题系列:深入剖析JVM之G1收集器、及回收流程、与推荐用例

金三银四马上到了&#xff0c;即将进入面试的高峰期。在BAT面试中&#xff0c;JVM基本都是必考的系列。你至少需要掌握JVM内存模型与JVM参数详细配置&#xff0c;JVM的4种垃圾回收算法、垃圾回收机制与总结&#xff0c;以及今天重点谈到的JVM垃圾回收算法的实现&#xff1a;JVM…

多任务学习方法

最近一直在做多任务&#xff0c;但是效果好象没什么提升&#xff0c;因为都是凭自己的想法和感觉在做。于是上网查找了一些这方面的资料&#xff0c;寻求一些理论上的支撑和前人经验上的帮助。 多任务学习&#xff1a; 故名思意&#xff0c;就是多个任务一起学习。为什么要进行…

曹羽 | 从知识工程到知识图谱全面回顾

本文转载自公众号&#xff1a;集智俱乐部。文本挖掘和图形数据库 | ©ontotext导语知识工程是符号主义人工智能的典型代表&#xff0c;近年来越来越火的知识图谱&#xff0c;就是新一代的知识工程技术。知识工程将如何影响未来人工智能领域的发展&#xff0c;甚至让计算机拥…

4大JVM性能分析工具详解,及内存泄漏分析方案

谈到性能优化分析一般会涉及到&#xff1a; Java代码层面的&#xff0c;典型的循环嵌套等 还会涉及到Java JVM&#xff1a;内存泄漏溢出等 MySQL数据库优化&#xff1a;分库分表、慢查询、长事务的优化等 阿里P8架构师谈&#xff1a;MySQL慢查询优化、索引优化、以及表等优化…

从 0 搭建一个工业级推荐系统

推荐系统从来没像现在这样&#xff0c;影响着我们的生活。当你上网购物时&#xff0c;天猫、京东会为你推荐商品&#xff1b;想了解资讯&#xff0c;头条、知乎会为你准备感兴趣的新闻和知识&#xff1b;想消遣放松&#xff0c;抖音、快手会为你奉上让你欲罢不能的短视频。而驱…

论文浅尝 | 虚拟知识图谱:软件系统和应用案例综述

本文转载自公众号&#xff1a;DI数据智能。Virtual Knowledge Graphs: An Overview of Systems and Use Cases作者&#xff1a;Guohui Xiao, Linfang Ding, Benjamin Cogrel & Diego Calvanese供稿&#xff1a;Guohui Xiao编者按&#xff1a;Data Intelligence 发表意大利博…

LeetCode 169. 求众数(摩尔投票)

文章目录1. 题目信息2. 解题思路3. 代码3.1 排序3.2 map计数3.3 摩尔投票1. 题目信息 给定一个大小为 n 的数组&#xff0c;找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在众数。 示例 1:输入…

阿里P8架构师谈:JVM的内存分配、运行原理、回收算法机制

不管是BAT面试&#xff0c;还是工作实践中的JVM调优以及参数设置&#xff0c;或者内存溢出检测等&#xff0c;都需要涉及到Java虚拟机的内存模型、内存分配&#xff0c;以及回收算法机制等&#xff0c;这些都是必考、必会技能。 JVM内存模型 JVM内存模型可以分为两个部分&…