52 | 算法实战(一):剖析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
《数据结构与算法之美》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(81)
- 最新
- 精选
- 郑晨Cc老师 关于redis的压缩列表有个地方不太明白 虽然压缩列表看起来想数组 但他能像数组一样支持按照下标进行直接随机访问吗?比如我要访问下标为n的数据我启不是需要知道之前从0到n-1的所有数据的长度才能找到n,那这跟链表的时间复杂读没啥区别啊,而且还占用了连续的内存空间? 还是说压缩列表中的每个元素的长度都记录在它的头部可以一次性的获取?
作者回复: 哈哈,你说的没错。压缩列表不支持随机访问。有点类似链表。但是比较省存储空间啊。Redis一般都是通过key获取整个value的值,也就是整个压缩列表的数据,并不需要随机访问。
2019-01-2514112 - 来碗绿豆汤压缩列表每个元素所占用的空间大小是不一定的,所以当想要随机访问某个元素的时候还是要像列表那样从头开始遍历,所以不能太大。理解对吗?
作者回复: 是的 没错
2019-04-10239 - 青铜5 周群力我猜压缩列表的好处是能利用l2缓存?
作者回复: 是的,有这么个好处。越小越有利于CPU缓存。
2019-02-06639 - Jerry银银发现一个功能:左滑进入上一篇,右滑进入下一篇
编辑回复: 看来是没少刷专栏😄
2019-01-25215 - 复兴值是字符串类型,老师一笔带过了,其实我想知道的是,值为字符串的键值对,是不是通过hash实现的,将键转换成index存储在hash表中。
作者回复: 是的,你理解的没错
2019-09-30210 - 铁匠跳表和B+数既然大部分场景下可以互换,为什么redis没有使用B+树而选择跳表?
作者回复: 跳表更灵活 更容易实现
2019-08-0847 - Twogou27老师,Redis字典数据类型中散列表的装载因子最大不就是1么,大于1是什么情况?
作者回复: 就是拉了很长的链表
2019-02-2637 - static想问老师一个困扰我很久的redis问题。 redis中字典(hash)在数据量少时会采用ziplist数据结构,由于数据量少,并且可以利用CPU缓存,即不失查询速度的情况下又能大幅减少内存占用。但是同为散列表的集合(set)为什么没有采用同样的策略,在数据量少时使用ziplist?而是使用了intset这种有序整数数组? 感谢老师回答!
作者回复: intset也不错啊,对CPU缓存也很友好的,不能指望所有的设计都是一样的呀。
2019-09-1644 - 蚂蚁内推+v王老师两种数据结构持久化: redius用“清除格式,持久化数据再组织数据结构” 这么看来是很消耗性能,为什么不用“保留数据结构”的方式。我理解后者只牺牲部分空间换取了更多性能 。 麻烦王老师解释下?
作者回复: 对于Redis来说,重启并不是很经常的事情。所以并不会经常从硬盘加载数据到内存再重构成数据结构。 实际上,两种存储格式都可以,可能Redis就是随意选择了一个而已。不要太纠结为啥选的是这个,而不是那个。
2019-01-2533 - balancer老师说的压缩列表,是整个数据 hash 或者set 实现是 压缩列表实现的,还是指 hash 或list 里面的具体一个元素是压缩列表实现的? 压缩列表的结构不太清楚
作者回复: 一整个都是用压缩列表实现的。
2019-04-162
收起评论