1.为什么要用缓存?
生活事例
小明是一家饭店的厨师,在饭店发展的初期,因为顾客不多因此小明生活得很悠闲,上班打卡玩手机,下班打卡逛夜店,生活过得十分惬意,但随着饭店的日益发展,顾客也越来越多了,因此出现了高峰期顾客长时间等待的情况,满意度也大幅下降。
因此老板就找到了小明,询问了相关的情况,小明说在高峰期自己要洗菜、切菜和炒菜,每个人的工作量都很大所以就忙不过了,因此上菜就比较慢了。
于是精明的老板就想到了一个好主意,他让厨师在平常不忙的时候把顾客长点的菜提前做好,然后妥善的保存起来,在高峰期直接拿出来热一下就好了,这样一来,果然工作效率就大大提升了,每到高峰期也能轻松应对了。
缓存定义
缓存是一个高速数据交换的存储器,使用它可以快速的访问和操作数据。
程序中的缓存
对于程序来说,当没有使用缓存时,程序的调用流程是这样的:
但随着业务的发展,公司的框架慢慢变成了多个程序调用一个数据库的情况了:
这是多部分公司的普遍的架构流程图,因此当公司业务发展到一定规模之后,最可能出现性能瓶颈的地方就是数据库。
数据库的资源同时也是程序中最昂贵的资源,因此为了防止数据库被过度的浪费,我们就需要给它雇一个“助理”了,这个助理就是缓存系统。
加入缓存后,程序的交互流程如下图所示:
这样改造之后,所有的程序不会直接调用数据库,而是会先调用缓存,当缓存中有数据时会直接返回,当缓存中没有数据时才去查询数据库,这样就大大的降低了数据库的压力,并加速了程序的响应速度。
缓存优点
相比于数据库而言,缓存的操作性能更高,缓存性能高的主要原因有以下几个:
- 缓存一般都是 key-value查询数据的,因为不像数据库一样还有查询的条件等因素,所以查询的性能一般会比数据库高;
- 缓存的数据是存储在内存中的,而数据库的数据是存储在磁盘中的,因为内存的操作性能远远大于磁盘,因此缓存的查询效率会高很多;
- 缓存更容易做分布式部署(当一台服务器变成多台相连的服务器集群),而数据库一般比较难实现分布式部署,因此缓存的负载和性能更容易平行扩展和增加。
2.缓存分类
缓存大致可以分为两大类:
- 本地缓存
- 分布式缓存
本地缓存
本地缓存也叫单机缓存,也就是说可以应用在单机环境下的缓存。所谓的单机环境是指,将服务部署到一台服务器上,如下图所示:
举个例子
本地缓存相当于每家企业的公司规定一样,不同的公司规定也是不同的,比如上班时间,不同的公司上班时间规定也是不同的,对于企事业单位来说一般要求9:00-17:00上班,而对于酒吧来说,这个时间就完全不适合了。
所以,本地缓存的特征是只适用于当前系统。
分布式缓存
分布式缓存是指可以应用在分布式系统中的缓存。所谓的分布式系统是指将一套服务器部署到多台服务器,并且通过负载分发将用户的请求按照一定的规则分发到不同服务器,如下图所示:
举个例子
分布式缓存相当于适用于所有公司的规定,比如无论是任何公司都不能偷税漏税,不能做违反法律的事情,这种情况就和分布式缓存很像,适用于所有的系统。
比如我们在分布式系统中的服务器A中存储了一个缓存key=laowang,那么在服务器B中也可以读取到 key=laowang 的数据,这样情况就是分布式缓存的作用。
3.常见缓存使用
本地缓存的常见使用: Spring Cache、MyBatis的缓存等。
分布式缓存的常见使用: Redis 和 Memcached。
本地缓存: Spring Cache
在Spring Boot项目,可以直接使用Spring 的内置Cache(本地缓存),只需要完成以下三个步骤就可以正常使用了:
- 开启缓存
- 操作缓存
- 调用缓存
开启缓存
在Spring Boot的启动类上添加如下代码,开启缓存:
@SpringBootApplication
@Enablecaching #开启缓存功能
public class BiteApplication {
public static void main(String[] args) {
SpringApplication.run(BiteApplication.class,args );
}
}
操作缓存
@service
public class UserService {