1.缓存介绍
1.1缓存简介
缓存:缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。为什么使用缓存?究其原因就是缓存的读写速度远快与磁盘,从减轻I/O开销和加快运行速度方便都有很好的效果。那么我们缓存什么?哪些经常读取而又不经常修改的数据,那些数据量较大又很少修改的数据。缓存策略三要素:缓存命中率、缓存更新策略、最大缓存容量。
1.2缓存命中率
如何解读缓存命中率,就是一个被缓存的数据被读取的次数/总读取次数。而这个命中率也是越高越好。
命中率=从缓存中读取的次数/总读取次数
未命中率=没有从换存中读取的次数/总读取次数
衡量一个缓存方案的好坏标准是:缓存命中率。缓存命中率越高,缓存方法设计的越好。
1.3缓存更新策略
说起缓存,那也就必定会聊到缓存更新策略,即在缓存到达最大容量时改如何处理。常用的缓存策略有:
- FIFO(First In First Out) 队列,先进先出,典型应用:MySQL的 query cache,采用的就是这种简单的缓存更新策略
- LFU(Least Frequently Used):最近最少使用算法,一定时间段内使用次数(频率)最少的那个被移除,借助计数器实现;
- LRU(Least Recently Used):最久未使用算法,使用时间距离现在最久的那个被移除,借助计数器和队列实现;
- TTL(Time To Live ):存活期,即从缓存中创建时间点开始直到它到期的一个时间段(不管在这个时间段内有没有访问都将过期)
- TTI(Time To Idle):空闲期,即一个数据多久没被访问将从缓存中移除的时间。
1.4最大缓存容量
大容量的缓存虽然可以在硬盘进行读写工作状态下,让更多的数据存储在缓存中,以提高硬盘的访问速度,但并不意味着缓存越大就越出众。缓存的应用存在一个算法的问题,即便缓存容量很大,而没有一个高效率的算法,那将导致应用中缓存数据的命中率偏低,无法有效发挥出大容量缓存的优势。算法是和缓存容量相辅相成,大容量的缓存需要更为有效率的算法,否则性能会大大折扣,从技术角度上说,高容量缓存的算法是直接影响到硬盘性能发挥的重要因素。更大容量缓存是未来硬盘发展的必然趋势。
以上便是缓存的基本知识,接下来我们来了解一下spring提供的cache。本文也主要以注解方式实现。
2.示例
2.1添加maven依赖
首先我们先添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.2源码简单分析
接着我们来看下spring提供的核心cache接口:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.cache;
import java.util.concurrent.Callable;
public interface Cache {
String getName();
Object getNativeCache();
Cache.ValueWrapper get(Object var1);
<T> T get(Object var1, Class<T> var2);
<T> T get(Object var1, Callable<T> var2);
void put(Object var1, Objec