高速输出-我们戏说缓存

缓存要解决的问题是速度的问题,使用缓存的目的是为了减少对物理资源的访问,缓存大量的应用在软硬件的方方面面,从 CPU 到硬盘,就应用了 一级缓存、二级缓存,少部分高速缓存和大量低速缓存相结合,以提高 CPU 的计算能力,本文讲的主要是系统集成项目中的软件级别的缓存。

缓存因果图

高速输出-我们戏说缓存

缓存在现代系统中的位置可以说是举足轻重,不是可有可无的问题了,而是怎么样用好的问题。怎么样讲好缓存这个话题,我思考了很久;如果是生搬硬套,我估计我肯定是凉凉,但要是上来就一顿代码操作,显得字太多,各位看官老爷也是要喷死我的(你们喷我算我赢)。各位看官就当故事随便看看就好了。

客户端缓存

小明同学是一个大学生,每个月都会从爸爸那里领取生活费,由于爸爸给的生活费比较充裕,他就将一部分存了起来,周而复始,固定频率,这就是浏览器网页缓存;有一天,他接到爸爸的一个电话,说每个月给现金,我总是从银行拿也不方便,这样,咱给存银行卡里头,但是说好了,每个月1号的时候转1000块进去,3号之前可以领取,过时不侯。这就是 Cookie!小明说爸,这时间太紧迫了,我万一太过于专心学习忘记取钱那你儿子可是要饿死的吖,到时候没人给你养老送终事儿就大了。他爸爸经过深思熟虑后,决定放开取现时间的限制:行,你想什么时候取都成,就是别把卡给弄掉了就行。这就是LocalStorage/IndexDB,浏览器本地存储。如果银行卡掉了(浏览器重装,删库跑路),那还得找爸爸。

服务器缓存

我们本次讨论的重点就是服务器缓存,对于小明的爸爸来说,每次给小明生活费之前都要到银行(数据库)去取钱出来,实在是太麻烦,不如提前把钱取出来准备好,每次取半年的钱出来放家里保险箱里(缓存),小明申请生活费的时候,直接给他就好了,节约时间效率又高,唯一的问题就是可能没那么安全,有可能被小偷把钱给偷了(缓存更新),然后就是半年时间过后再重新取一笔出来(缓存过期策略)。

静态对象缓存

静态对象也是一种特殊的缓存,静态对象作用于程序的整个生命周期中。需要注意的是,静态对象不会被 GC 回收 ,但是,如果静态对象被多次引用覆盖,那么之前的引用就有可能被 GC 回收。这就好像,小明在向爸爸领取生活费的时候,发现这次领到手的钱实在是太破旧了,都不好意思花出去,爸爸只好重新给了另一份。

会话级缓存

在 Web 站点中,Session 是私有制的,各个 Session 之间是不会共享内存对象的,我们可以利用这个特性(在Asp.NET 时代常用)来暂时保存一些数据,例如用户购物车。还是以小明的需求为例子,小明下面还有一个妹妹,妹妹每个月都可以从爸爸那里多领取200元生活费,看到妹妹的资源这么好,小明愤愤不平,就像妹妹提议共享生活费,一家人一起用,多好吖!结果小明被爸爸揍了一顿,还收回了部分生活费。

进程级别缓存

基本上每个应用程序都具有本地缓存的能力,在 Asp.NET 中就有 MemoryCache ,也叫做进程级缓存(本地缓存),MemoryCache 和 分布式缓存的作用基本一致,所不同的是,本地缓存在应用程序停止后就会被释放掉,无法进行持久存储。就好像,小明在上大学期间,每个月都是生活费的,但是到暑假的时候就没有了(只能靠苦逼的暑期工挣点生活费啊)。

分布式缓存

分布式缓存是个好东西,目前市场上出现了非常多的 nosql 数据库,都可用作缓存数据库,有时候,这些缓存数据库也提供持久化的能力。

小明家的生活条件,在经过爸爸的不懈努力之后,生活水平渐渐提高了;有一天,爸爸对小明说:明仔吖,咱们家现在生活水平提高了,但是爸爸也越来越忙了,这样,如果我忙的时候,你问妈妈或者爷爷奶奶,也是可以拿到生活费的,咱们家这几位长辈手里都有钱了,这就是分布式缓存。

但是分布式缓存又分为主从模式和集群模式,上面说的是集群模式,爸爸妈妈爷爷奶奶都可以拿钱,但是主从模式就不同了,主从模式就是钱都在爸爸手里,爸爸会把钱分给每个长辈一份,如果当时正好爸爸太忙了,没来得及分给妈妈,而小明又恰好问妈妈要生活费的话;妈妈只能对他说:小命呀,不好意思,妈妈这里也没有,你看看再问问其它人(客户端自己轮询),在问了妈妈、爷爷后(引用指向),终于知道,钱在爸爸那里,还得问爸爸要生活费。而且爸爸给其它人分钱的时候,还要占用他工作的时间。

缓存雪崩

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppffx.html