「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。 在公司带了校招生,经常会遇到校招生问一些问题。 当然,按照我的套路,我是绝不会帮学员排查和调试代码的,当然也不会跟学员掰扯细枝末节的技术的(不会google的学员怕是不存在吧)。
回答这个问题前,我们要思考前置问题:“为什么缓存能提升服务效率呢?” ,所有的缓存,说透了核心就只是空间换时间。好处就是减少服务耗时,弊端就是多用点存储、增加了系统复杂度、甚至有些时候这中间还要牺牲一定的数据时效性。
这时候我们要考虑的是在工程领域,我们能用的存储有哪些呢? 操作系统原理、微机原理、计算体系结构之类的理论书可以帮助到你回答这个问题。(前几天有人回贴说背“八股文”有什么用呢?八股文工作里又用不到,希望这位同学能看的到,有机会再专门写一篇八股文吧)
时间有限,也不细抠了,在工程应用领域大概能用到的单机环境下的缓存,大抵就是 内存 和 硬盘了,
在RunTime环境里又有进程/线程缓存和共享内存缓存,硬盘现在也有了SSD硬盘和HHD硬盘。加上网络环境,就又增加了外部缓存,外部缓存可能是MySQL服务的缓存、Nginx反向代理缓存、Memcached等等。
这些工程中常用的缓存,按效率排序是 内存 -> 硬盘 -> 跨网络缓存 ,这个顺序一般也意味着其存储大小也是从小到大的。 这里仅仅知道这个排序,对工程师来说是不够的,还要知道他们大概的量级,才能更好的设计和估计自己系统的效率。 一般而言,内存是1~10纳秒的,硬盘大概10~1000纳秒的,外部缓存大概就要超1毫秒甚至10毫秒,这个量级只是大概,还需要工程师依据生产环境实测。
刚才也说了,缓存有存储限制,在存储空间不足的时候就会有缓存替换,这种缓存替换也是核心损耗效率的环节,所以在这个环节里,工程师用了一个指标来评判缓存设计的是否合理,缓存命中率。 如果缓存命中率太低,做了缓存服务甚至还会变慢(外部缓存),那整体可能还不如不做缓存。
一般工程领域都是多级缓存混用的,也就是缓存设计里常说的“多级缓存”,如:进程/线程内缓存、共享缓存、本地文件或配置缓存、再到远端缓存。
还有一个点要考虑的是缓存是会跟服务竞争资源的,给缓存的资源多了,服务自然就少了,这也是设计缓存时要考虑的。比如内存/磁盘IO的竞争、内存大小的竞争、CPU的竞争等。
了解到以上这些缓存的整体框架和结构,基本上就能找到“为什么做了缓存效率没有提升呢?”这个问题的答案了。
学员既学到了框架性知识、又可以增加自己工程实践能力,还节省了导师手把手帮助排查问题时间,真是导师偷懒装B必备技能啊。
有机会还想针对缓存工程设计方案做个分享。
#今日份十分钟#真的很超标...都二十分钟了...