俗话说心血来潮总是三分钟热度,希望这三分钟的解释是,下一分钟,下一分钟,下一分钟。
很喜欢极客时间上乔新亮老师的课程,老师建议将职业分为三个台阶,每5年一个台阶。故其实一直在想什么是一个程序员在前5年职业生涯的核心竞争力,都说要当T型人才,感觉若花时间将我们后端最常用的存储搞清楚可谓是最值得的。
值得再啰嗦的一点是,做了两年业务,发现就算是工作很久的程序员都存在一个比较常见的表象硬伤,文档写得一塌糊涂,却往往觉得这个不是很重要。其实想来文档写得差的根本原因是没有很深入的思考,或PM给到需求直接做,或自己想到做法简单记录直接做。其实大局观或者说全局观是非常重要的,一定要和PM聊清楚未来一季度,半年乃至一年的规划,一定要想清楚所做东西领域的划分,一定要想清楚系统的整体建模,一定要想清楚哪些值得去大做,哪些不是核心要做的。先验知识很重要,要获得足够的先验知识之后再去动手。动手时本人着力推荐对UML和DDD进行理解,用例图,类图,流程图,状态图等等;核心域,支撑域,通用域,实体,聚合,值对象等等。
啰嗦完,进入我们今天的主题。
存储
后端的存储包括哪些?粗浅理解如下:从常用的组件角度看,包括MySQL(最常用关系型数据库),ES(倒排索引),HBase(LSM),Hive(MR+HDFS),TiDB(分布式关系型数据库,Raft+RocksDB),Redis(内存级别KV存储),Tair(内存+磁盘式KV存储),对象存储(Google S3),本地缓存((concurrent)HashMap,Guava cache,Caffeine);从操作系统及速度角度看,寄存器,L1缓存,L2缓存,L3缓存,主存,本机磁盘,远程存储(同机房Redis,同机房MySQL,HBase等等);从我们实际接触而言,寄存器,L1/L2/L3,主存,本机磁盘等等都封装在操作系统的内存管理,文件系统管理等下,Redis,MySQL,ES,本地缓存等则是我们最常搭配使用来解决业务问题的。
组件很多,每个组件都有适用的场景,业务场景决定技术选型,以满足需求为前提,向前看半年。若非必要,勿增实体,增加了组件,就增加了额外的难度,难度并不会消失,可能只是从你这边转移到其他地方。
前面说了常见的存储,再胡乱引申一下:CDN,消息队列(Kafka),Spring三级缓存,Linux PageCache,JVM内部堆栈。
考虑
存储之间互为表里,常用的如Redis作为MySQL的热数据存储;MySQL作为Hive的热数据存储地(某种意义上说得通);ES+KV常常用来存较冷数据,来分担线上MySQL的压力;消息队列也常常用来在一些场景下实现暂存。互为表里,数据一致性(各种类型一致性,线性一致性,因果一致性等等)则需要讨论。
再具体到实际组件,每个组件都是当前计算机技术的集大成者,每一个都是针对具体场景的集大成者的实现,深挖一个,会发现其他的很多都类似。故先建立大局观,并且俗话说细节为王,望自己随后可以挖住细节。
计划
先从本地缓存说起,若追根溯源就得说缓存的老祖宗,计算机L1/L2/L3缓存了。但又想起来很好的一段话:谈恋爱,非要大家都坦白从幼儿园开始的情史,是大家彼此过不去。要学会“透明”。故就只说本地缓存((concurrent)HashMap,Guava Cache,Caffeine),计划本周内产出(concurrent)HashMap, Guava Cache,Caffeine中的一篇。
总结
1、职业阶段分为3个台阶,做好T型人才建设,着力于存储。
2、存储很多,各个组件都是在具体场景下的集大成者,故大局观先建立起来,随后践行细节为王。
3、从本地缓存开始,本周产出(concurrent)HashMap, Guava Cache,Caffeine中的一篇(如果有读者看,可以提提看想看哪个)。
4、另最后再次啰嗦一定要和PM聊清楚,建立大局观,另外UML和DDD要践行起来。