高并发下的各种缓存

前言

Cache在大家最开始接触开发的时候应该就听过许多了,比如浏览器缓存、OS中的缓存、什么缓存一致性等等,各式各样的Cache,看起来各种高大上的样子,看着群里或者某乎的大佬们在不断的讨论或者推缓存相关的blog。
近期对于缓存相关研究了不少,自己也在试着写一个Cache中间件来研究下。过程中整理了一下,准备做成一个系列文章发一下,也希望大家给我多多指正。
在正式开始开始写缓存之前,当然是先研究领域内现有的一些Cache 相关的内容,作为一个引言。
后续分别从OS 中的缓存、JVM中的缓存、Web 应用中常见缓存、现有常作为独立缓存的Redis/MemCache、InnoDB中的存储引擎、浏览器中的缓存、分布式缓存的实现案例 进行对应的浅析及相应Cache设计主题的引入。下面先大体的介绍一下各个场景及实现方式,后续会独立推送对应的浅析文章。

Cache 于操作系统

Cache 最早的出现是在操作系统中,致力于解决速度的大幅度差异而效率低下 引出的一种概念。
在早期操作系统中,最核心的速度差异在于 CPU与主存 & 主存与磁盘 CPU与磁盘 之间的速度差异。往往硬件方面的限制因素会更多一些,比如说昂贵的寄存器、相对昂贵的主存介质,CPU速度与主存读取速度、主存速度与磁盘IO的发展速度不均衡,这些几乎是一些无可奈何的客观因素,尽管技术圈的大家一直在为此努力。因为这些因素的限制,我们不得不想出一些策略来均衡一些短板的出现,其中诞生了一些复用技术、中断、虚拟内存、缓存等均衡及提升计算机整体瓶颈与资源利用率的技术。
这里我们要说的是缓存,从我们计算机的心脏CPU开始说起,CPU一直是速度领先于计算机其他组件的一个存在,算是第一数量级,大家学过 计算机组成或者计算机系统的话应该非常清楚,这里先不展开描述,主存整体来说是第二数量级的存在,现阶段磁盘大多为仍为机械结构更是慢的惊人,即使是SSD虽然对于普通机械磁盘来说速度上快一点但是仍然不足,之间的差异算是鸿沟。
为实现速度的均衡也就是让主存能够不太拖CPU的后腿,磁盘不拖CPU及主存的后腿诞生了由 寄存器 -> 高速缓存 -> 主存 -> 磁盘 这样的一种结构,正在使用的数据通常是存在于寄存器中的,最近高频使用的数据是存在于高速缓存中,最近可能会使用的高频数据是存放在主存中的,这种描述虽然不太准确,但是更容易让大家感受缓存的设计思路。根据数据的使用频次及对应材质的速度差异进行分析 做到物尽其用,发挥各自的优势,比如速度快或者低廉的价格,使计算机能够以更低的价格发挥出更高的性能。
其中提到的如何分析材质及数据的使用频次就引出了对应Cache的设计思想及对应解决的问题。
比如说

设备:

磁盘对应的是最廉价的设备,可以以非常低的价格来存储更多数据。主存相对来说要贵一些,但是速度上已经有了质的提升,CPU中的寄存器几乎与CPU速度一致但是价格非常昂贵。

数据:

数据的使用频次差异性非常强,比如说我们操作系统所需的程序代码,这几乎是高频使用的,而我们的计算机上的用户应用 使用频次算是中等,用户应用所需要的数据频次就会更低一些,我们存储在磁盘上的文本图像等使用频率更低。
现在我们就可以让速度最快最昂贵容量最小的寄存器来储存最近需要执行的指令,让高速缓存存储正在执行的所需的指令集,让主存来存储我们最近可能需要运行的程序及数据,让能迅速寻址的那部分磁盘来存储稍低频次所使用的数据,让磁盘其他部分来存储那些需要保存但是几乎不常使用的数据。这样CPU与内存、CPU与磁盘、主存与磁盘之间的速度差异在运行过程中就不再那么的明显,我们要做的只是在恰当的时机完成不同介质之间的数据交换,让快的设备去访问速度稍次的设备。
这算是Cache大体的实现思想或者说思路,其中所谓的频次、材质只是举例,在现实问题中可能是CPU与磁盘,也可能是也可能是不同的服务器站点,也可能是发消息方与接受方处理速度的差异,我们需要针对具体的问题进行对应的抽象,本质来说就是速度上的差异。
例子中提到了不同介质之间数据的交换来保证能够相邻访问(缓存命中率问题),这就引出了Cache所要解决的几个核心问题及Cache对应的实现。
1、如何判断速度的频次?(是否为热点数据)
2、何时把热点数据放入缓存中?
3、热点数据应该放在哪一部分?
4、应该把哪个数据移走?(数据的淘汰策略)
5、移走的数据应该存放于何处?(数据的降级问题)
在我们的操作系统中已经完成了对应的策略,具体的实现会在《浅析 操作系统中的缓存》中阐述~
这里仅仅是大体描述一下及对应的背景及应用介绍。

Cache 于JVM

这里要说的是JVM中缓存抽象思想的使用,缓存最主要的解决速度差异的问题以提升整体效率,在JVM中也是这样的。
Java 是一种解释型语言,其实这个话不能说的如此绝对,自动JIT出现之后,Java 中的绝大部分热点代码是编译为机器码放在缓存区中的。这其实就是一种缓存思想的使用。
最初Class 文件是存放于磁盘或者从网络中获取的,频次较低。
当我们需要使用一部分代码从磁盘或者网络中加载并且解析链入内存,以供我们快速的使用,频次偏高。而一个文件完全不使用后又会被清楚内存,详见class的清理。
当工程中某一部分代码已经被鉴定为高频使用时,这一块代码将会直接被编译为机器码为下次直接使用而不是再次解释做准备,频次最高。
而这三种方式的速度也是依次提升的。使用频次的最高的以最快的方式使用。
而对应的什么样的代码应该被缓存,这就取决于JIT的热点代码判断策略。并且这里存在一个很经典的现实问题,叫做jvm的代码缓存耗尽导致性能下降。
以上问题的解释后续会详细的给出。
篇幅太长········
Cache 于Web 应用、Cache 于Redis/MemCache、Cache 与InnoDB 存储引擎、Cache 于浏览器、Cache 于分布式系统
这几个就先不详细介绍了,不小心写的有点长。后续单独推送~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • cache在计算机组织结构中很重要,理解cache对编写性能友好的程序很有帮助。 1. Cache的历史 在科研领...
    古剑诛仙阅读 1,568评论 0 0
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,727评论 0 30
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,841评论 0 5
  • 理论总结 它要解决什么样的问题? 数据的访问、存取、计算太慢、太不稳定、太消耗资源,同时,这样的操作存在重复性。因...
    jiangmo阅读 2,847评论 0 11