在学习和使用Redis的过程中,总不可避免地遇见一些棘手的问题,比如:
Redis的key和数据结构应该怎么设计?有什么最佳实践?
Redis集群如何均衡数据?又如何横向扩展?
怎么保证数据的一致性?热点数据的问题怎么解决?
RDB持久化生成的数据快照,每次更新是全量更新还是增量更新?
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题怎么解决?
如何高效阅读Redis源代码?
蒋德钧老师根据自己多年的研究以及教学经验,梳理了一套系统的Redis学习方法。
他将纷繁复杂的Redis知识和问题归纳在“两大维度,三大主线”这个框架之中,希望帮你建立起系统观和全局观,从而带你彻底搞懂底层实现原理。
![](https://img.haomeiwen.com/i12979420/519346c94cf1ec0e.jpeg)
同样是使用Redis,但是不同公司的“玩法”却不太一样,比如说,有做缓存的,有做数据库的,也有用做分布式锁的。
不过,他们遇见的“坑”,总体来说集中在四个方面:
CPU使用上的“坑”,例如数据结构的复杂度、跨CPU核的访问;
内存使用上的“坑”,例如主从同步和AOF的内存竞争;
存储持久化上的“坑”,例如在SSD上做快照的性能抖动;
网络通信上的“坑”,例如多实例时的异常网络丢包。
为什么懂得了一个个技术点,却依然用不好Redis?
我知道,很多同学都是带着一个个具体的问题来学这门课的,比如说,Redis数据怎么做持久化?集群方案应该怎么做?
这些问题当然很重要,但是,如果你只是急于解决这些细微的问题,你的Redis使用能力就很难得到质的提升。
这些年,在和国内大厂的合作过程中,我发现,很多技术人都有一个误区,那就是,只关注零散的技术点,没有建立起一套完整的知识框架,缺乏系统观,但是,系统观其实是至关重要的。
从某种程度上说,在解决问题时,拥有了系统观,就意味着你能有依据、有章法地定位和解决问题。
如何高效地形成系统观呢?
我们做事情一般都希望“多快好省”,说白了,就是希望花很少的时间掌握更丰富的知识和经验,解决更多的问题。
听起来好像很难,但实际上,只要你能抓住主线,在自己的脑海中绘制一幅Redis全景知识图,这完全是可以实现的。
那么,所谓的Redis知识全景图都包括什么呢?
简单来说,就是“两大维度,三大主线”。
![](https://img.haomeiwen.com/i12979420/76bba3f461aafee9.jpg)
“两大维度”就是指系统维度和应用维度,“三大主线”也就是指高性能、高可靠和高可扩展(可以简称为“三高”)。
首先,从系统维度上说,你需要了解Redis的各项关键技术的设计原理,这些能够为你判断和推理问题打下坚实的基础,而且,你还能从中掌握一些优雅的系统设计规范,例如run-to-complete模型、epoll网络模型,这些可以应用到你后续的系统开发实践中。
这里有一个问题是,Redis作为庞大的键值数据库,可以说遍地都是知识,一抓一大把,我们怎么能快速地知道该学哪些呢?别急,接下来就要看“三大主线”的魔力了。
别看技术点是零碎的,其实你完全可以按照这三大主线,给它们分下类,就像图片中展示的那样,具体如下:
高性能主线,包括线程模型、数据结构、持久化、网络框架;
高可靠主线,包括主从复制、哨兵机制;
高可扩展主线,包括数据分片、负载均衡。
你看,这样,你就有了一个结构化的知识体系。
当你遇见这些问题时,就可以按图索骥,快速找到影响这些问题的关键因素,这是不是非常省时省力呢?
其次,在应用维度上,我建议你按照两种方式学习: “应用场景驱动”和“典型案例驱动”,一个是“面”的梳理,一个是“点”的掌握。
我梳理了一下这些年遇到的、看到的Redis各大典型问题,同时结合相关的技术点,给Redis做了一个问题画像图。
无论你遇见什么问题,都可以拿出来这张图,这样你就能快速地按照问题来查找对应的Redis主线模块了,然后再进一步定位到相应的技术点上。
![](https://img.haomeiwen.com/i12979420/0013e74ff9e3a1a8.jpg)
![](https://img.haomeiwen.com/i12979420/2a9125d6a7066e3a.jpg)
![](https://img.haomeiwen.com/i12979420/7841832a18fe2620.jpg)
参考
Redis 核心技术与实战
https://time.geekbang.org/column/intro/100056701
Redis 源码剖析与实战
https://time.geekbang.org/column/intro/100084301
网友评论