初识缓存Cache

本文深入探讨缓存的概念及其在改善应用性能中的作用。解释了缓存的原因,包括如何减少数据库压力和提升用户体验。详细介绍了几种缓存算法,如LFU、LRU、LRU2、2Q、ARC、MRU和FIFO,并提供了部分实现演示。重点突出缓存技术的核心价值和应用场景。

一.什么是缓存

    缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些

     缓存可以认为是数据的池,这些数据是从数据库里的真实数据复制出来的,并且为了能别取回,被标上了标签(键 ID)

二.需要缓存的原因   

     很久很久以前,在还没有缓存的时候……用户经常是去请求一个对象,而这个对象是从数据库去取,然后,这个对象变得越来越大,这个用户每次的请求时间也越来越长了,这也把数据库弄得很痛苦,他无时不刻不在工作。所以,这个事情就把用户和数据库弄得很生气,接着就有可能发生下面两件事情:


1.用户很烦,在抱怨,甚至不去用这个应用了(这是大多数情况下都会发生的)——极差交互体验

2.数据库为打包回家,离开这个应用,然后,就出现了大麻烦(没地方去存储数据了)(发生在极少数情况下)——数据库崩溃


三.缓存的一些基本概念

    

(1)命中(hit):


    当客户发起一个请求(我们说他想要查看一个产品信息),我们的应用接受这个请求,并且如果是在第一次检查缓存的时候,需要去数据库读取产品信息。如果在缓存中,一个条目通过一个标记被找到了,这个条目就会被使用、我们就叫它缓存命中。所以,命中率也就不难理解了。


(2)未命中Miss:


但是这里需要注意两点:


1. 如果还有缓存的空间,那么,没有命中的对象会被存储到缓存中来。

2. 如果缓存慢了,而又没有命中缓存,那么就会按照某一种策略,把缓存中的旧对象踢出,而把新的对象加入缓存池。而这些策略统称为替代策略(缓存算法),这些策略会决定到底应该提出哪些对象。


(3)存储成本:

    当没有命中时,我们会从数据库取出数据,然后放入缓存。而把这个数据放入缓存所需要的时间和空间,就是存储成本。


(4)索引成本:

    和存储成本相仿。使用与建立索引也需要时间和空间。


(5)失效:

    当存在缓存中的数据需要更新时,就意味着缓存中的这个数据失效了。


(6)替代策略:

    当缓存没有命中时,并且缓存容量已经满了,就需要在缓存中踢出一个老的条目,加入一条新的条目,而到底应该踢出什么条目,就由替代策略决定。


(7)最优替代策略:

    最优的替代策略就是想把缓存中最没用的条目给踢出去,但是未来是不能够被预知的,所以这种策略是不可能实现的。但是有很多策略,都是朝着这个目前去努力。


四.缓存算法与部分实现演示


 (1)Least Frequently Used(LFU):最不常用缓存算法

          每个缓存对象计算他们被使用的频率。把最不常用的缓存对象踢走。

 (2)Least Recently User(LRU):最近最少使用缓存算法——浏览器缓存算法

           新的对象会被放在缓存的顶部,当缓存达到了容量极限,把底部的对象踢走,原理就是把最新被访问的缓存对象,放到缓存池的顶部。所以,经常被读取的缓存对象就会一直呆在缓存池中。有两种方法可以实现,array数组 或者是 linked list链表。

(3)Least Recently Used 2(LRU2):两次最少使用缓存算法

           把被两次访问过的对象放入缓存池,当缓存池满了之后,把有两次最少使用的缓存对象踢走。因为需要跟踪对象2次,访问负载就会随着缓存池的增加而增加。如果用在大容量的缓存池中,就会有问题。另外,还需要跟踪那么不在缓存的对象,因为对象还没有被第二次读取。总体来说比LRU好

 (4)Two Queues(2Q):两次访问转移缓存算法

           把被访问的数据放到 LRU 的缓存中,如果这个对象再一次被访问,就转移到第二个、更大的 LRU 缓存。踢走缓存对象是为了保持第一个缓存池是第二个缓存池的1/3。当缓存的访问负载是固定的时候,把 LRU 换成 LRU2,就比增加缓存的容量更好。这种机制使得比 LRU2 更好

(5)Adaptive Replacement Cache(ARC):自适应替换缓存算法

           介于 LRU 和 LFU 之间,为了提高效果,由2个 LRU 组成,第一个,也就是 L1,包含的条目是最近只被使用过一次的,而第二个 LRU,也就是 L2,包含的是最近被使用过两次的条目。因此, L1 放的是新的对象,而 L2 放的是常用的对象。

           此算法被认为是性能最好的缓存算法之一,能够自调,并且是低负载的。既保存着历史对象,这样就可以记住那些被移除的对象,同时,也可以看到被移除的对象是否可以留下,取而代之的是踢走别的对象。

(6)Most Recently Used(MRU):最近最多使用缓存算法

         移除最近最多被使用的对象,当一次访问过来的时候,有些事情是无法预测的,并且在缓存系统中找出最少最近使用的对象是一项时间复杂度非常高的运算,这就是为什么该算法是最好的选择。一般用作数据库内存缓存中!每当一次缓存记录的使用,把它放到栈的顶端。当栈满了的时候,会把栈顶的对象给换成新进来的对象。

(7)First in First out(FIFO):先进先出缓存算法

      先进先出低负载算法,并且对缓存对象的管理要求不高。通过一个队列去跟踪所有的缓存对象,最近最常用的缓存对象放在后面,而更早的缓存对象放在前面,当缓存容量满时,排在前面的缓存对象会被踢走,然后把新的缓存对象加进去。速度快,但是并不适用。

(8)Other


代码稍后~~~



转载于:https://my.oschina.net/liyixiangBlog/blog/364359

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值