/***
*
* @Author: Kode
* @Date: 2018年7月5日22:29:13
*/
什么是缓存?
专门用一块物理内存来存储一些数据,这就是缓存
缓存的作用
解决传输速度的问题。CPU的计算速度和IO传输的速度不是一个量级上的,工程师们为了把这个差距减小,利用二八原理和局部访问性原理,提出缓存这个概念,就是在CPU和内存之间加一块专用的物理器件。
缓存的设计
提起设计缓存,应该从使用缓存会引起什么问题入手,然后根据这些问题想出一个好的解决方案。
我觉得缓存本质问题就是你存的内容被访问的频率很低。怎么解决这个问题呢? 也就是怎么设计一个好的缓存结构呢?
在设计缓存结构之前,得先普及一些专业名词,毕竟我们是专业的嘛!
命中
当客户发起一个请求(我们说他想要查看一个产品信息),我们的应用接受这个请求,并且如果是在第一次检查缓存的时候,需要去数据库读取产品信息。如果在缓存中,一个条目通过一个标记被找到了,这个条目就会被使用、我们就叫它缓存命中。 如果没有命中的话,那肯定就是缓存没命中。
Cache miss
- 如果还有缓存的空间,那么,没有命中的对象会被存储到缓存中来
- (缓存算法)如果缓存满了,而又没有命中缓存,那么就会按照某一种策略,把缓存中的旧对象踢出,而把新的对象加入缓存池。而这些策略统称为替代策略,这些策略会决定到底应该提出哪些对象。
存储成本
当没有命中时,我们会从数据库取出数据,然后放入缓存。而把这个数据放入缓存所需要的时间和空间,就是存储成本。
失效
当存在缓存中的数据需要更新时,就意味着缓存中的这个数据失效了。
替代策略
Least Frequently Used(LFU)
Least Recently User(LRU)
First in First out(FIFO)
Random Cache
算法各种各样,但基本上都是在出现的频率这方面下功夫。下面讲一下具体的实现结构(数据结构)
在Java中应该先定义一个缓存对象,这个对象应该有被命中数量的属性。
public class CacheElement
{
private Object objectValue;
private Object objectKey;
private int index;
private int hitCount; // getters and setters
}
后面就是用什么类型的集合去存储了。可以选用的是:
HashMap Array LinkedHashMap 等等。
后面有时间在研究研究这些。以上内容有自己见解,也有参考、
参考资料:缓存、缓存算法和缓存框架简介