数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

52 | 算法实战(一):剖析Redis常用数据类型对应的数据结构

跳表
压缩列表
散列表
有序数组
散列表
压缩列表
双向循环链表
压缩列表(ziplist)
底层数据结构:字符串
如何将二叉查找树持久化到磁盘中?
Redis中为什么会使用多种数据结构来实现数据类型?
理解数据结构和算法基础有助于理解Redis源码
Redis封装了常用数据结构的底层实现
Redis使用渐进式扩容缩容策略来避免大量数据搬移导致的服务停顿
Redis采用清除原有存储结构,将数据存储到磁盘中的方式
有序集合(sortedset)
集合(set)
字典(hash)
列表(list)
字符串(string)
Redis主要作为内存数据库使用,也支持将数据存储在硬盘中
Redis的读写效率非常高
Redis是一种键值(Key-Value)数据库
课后思考
总结引申
数据结构持久化
常用数据类型
Redis数据库介绍
Redis中常用的数据类型,底层是用哪种数据结构实现的?

该思维导图由 AI 生成,仅供参考

到此为止,专栏前三部分我们全部讲完了。从今天开始,我们就正式进入实战篇的部分。这部分我主要通过一些开源项目、经典系统,真枪实弹地教你,如何将数据结构和算法应用到项目中。所以这部分的内容,更多的是知识点的回顾,相对于基础篇、高级篇的内容,其实这部分会更加容易看懂。
不过,我希望你不要只是看懂就完了。你要多举一反三地思考,自己接触过的开源项目、基础框架、中间件中,都用过哪些数据结构和算法。你也可以想一想,在自己做的项目中,有哪些可以用学过的数据结构和算法进一步优化。这样的学习效果才会更好。
好了,今天我就带你一块儿看下,经典数据库 Redis 中的常用数据类型,底层都是用哪种数据结构实现的?

Redis 数据库介绍

Redis 是一种键值(Key-Value)数据库。相对于关系型数据库(比如 MySQL),Redis 也被叫作非关系型数据库
像 MySQL 这样的关系型数据库,表的结构比较复杂,会包含很多字段,可以通过 SQL 语句,来实现非常复杂的查询需求。而 Redis 中只包含“键”和“值”两部分,只能通过“键”来查询“值”。正是因为这样简单的存储结构,也让 Redis 的读写效率非常高。
除此之外,Redis 主要是作为内存数据库来使用,也就是说,数据是存储在内存中的。尽管它经常被用作内存数据库,但是,它也支持将数据存储在硬盘中。这一点,我们后面会介绍。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Redis中常用的数据类型包括字符串、列表、字典、集合和有序集合,它们在底层都是用不同的数据结构实现的。Redis根据数据的特点选择基于有序数组或散列表的实现方式来处理集合类型,而有序集合则可以使用跳表或压缩列表来存储数据。这样的底层数据结构选择使得Redis能够高效地存储和处理不同类型的数据,同时保证读写效率和内存利用率。此外,文章还介绍了Redis的数据结构持久化问题,以及两种解决思路。通过了解这些底层实现方式,开发者可以更好地理解Redis的内部工作原理,从而更好地应用数据结构和算法优化自己的项目。文章还引申讨论了数据结构和算法对于理解Redis源码的重要性,以及对于个人创新的帮助。文章内容丰富,对于Redis的数据类型和底层实现方式进行了深入的探讨,对于开发者和技术人员具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(81)

  • 最新
  • 精选
  • 郑晨Cc
    老师 关于redis的压缩列表有个地方不太明白 虽然压缩列表看起来想数组 但他能像数组一样支持按照下标进行直接随机访问吗?比如我要访问下标为n的数据我启不是需要知道之前从0到n-1的所有数据的长度才能找到n,那这跟链表的时间复杂读没啥区别啊,而且还占用了连续的内存空间? 还是说压缩列表中的每个元素的长度都记录在它的头部可以一次性的获取?

    作者回复: 哈哈,你说的没错。压缩列表不支持随机访问。有点类似链表。但是比较省存储空间啊。Redis一般都是通过key获取整个value的值,也就是整个压缩列表的数据,并不需要随机访问。

    2019-01-25
    14
    112
  • 来碗绿豆汤
    压缩列表每个元素所占用的空间大小是不一定的,所以当想要随机访问某个元素的时候还是要像列表那样从头开始遍历,所以不能太大。理解对吗?

    作者回复: 是的 没错

    2019-04-10
    2
    39
  • 青铜5 周群力
    我猜压缩列表的好处是能利用l2缓存?

    作者回复: 是的,有这么个好处。越小越有利于CPU缓存。

    2019-02-06
    6
    39
  • Jerry银银
    发现一个功能:左滑进入上一篇,右滑进入下一篇

    编辑回复: 看来是没少刷专栏😄

    2019-01-25
    2
    15
  • 复兴
    值是字符串类型,老师一笔带过了,其实我想知道的是,值为字符串的键值对,是不是通过hash实现的,将键转换成index存储在hash表中。

    作者回复: 是的,你理解的没错

    2019-09-30
    2
    10
  • 铁匠
    跳表和B+数既然大部分场景下可以互换,为什么redis没有使用B+树而选择跳表?

    作者回复: 跳表更灵活 更容易实现

    2019-08-08
    4
    7
  • Twogou27
    老师,Redis字典数据类型中散列表的装载因子最大不就是1么,大于1是什么情况?

    作者回复: 就是拉了很长的链表

    2019-02-26
    3
    7
  • static
    想问老师一个困扰我很久的redis问题。 redis中字典(hash)在数据量少时会采用ziplist数据结构,由于数据量少,并且可以利用CPU缓存,即不失查询速度的情况下又能大幅减少内存占用。但是同为散列表的集合(set)为什么没有采用同样的策略,在数据量少时使用ziplist?而是使用了intset这种有序整数数组? 感谢老师回答!

    作者回复: intset也不错啊,对CPU缓存也很友好的,不能指望所有的设计都是一样的呀。

    2019-09-16
    4
    4
  • 蚂蚁内推+v
    王老师两种数据结构持久化: redius用“清除格式,持久化数据再组织数据结构” 这么看来是很消耗性能,为什么不用“保留数据结构”的方式。我理解后者只牺牲部分空间换取了更多性能 。 麻烦王老师解释下?

    作者回复: 对于Redis来说,重启并不是很经常的事情。所以并不会经常从硬盘加载数据到内存再重构成数据结构。 实际上,两种存储格式都可以,可能Redis就是随意选择了一个而已。不要太纠结为啥选的是这个,而不是那个。

    2019-01-25
    3
    3
  • balancer
    老师说的压缩列表,是整个数据 hash 或者set 实现是 压缩列表实现的,还是指 hash 或list 里面的具体一个元素是压缩列表实现的? 压缩列表的结构不太清楚

    作者回复: 一整个都是用压缩列表实现的。

    2019-04-16
    2
收起评论
显示
设置
留言
81
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部