本地缓存与多级缓存

一、前言
缓存对于一个高并发场景下的微服务应用来说具有重要的作用,不管是在架构选型还是设计阶段,缓存都是应用扛高并发提升吞吐量的有效手段。缓存对于大多数开发的同学来说并不陌生,一个基本的缓存使用流程如下:
本地缓存与多级缓存_第1张图片
简而言之,缓存的使用流程可归纳如下:
本地缓存与多级缓存_第2张图片

请求到达服务端;
先从缓存获取数据,缓存命中直接返回;
缓存未命中,查询数据库,然后返回数据,同时同步缓存;

二、多级缓存问题
2.1 缓存分类
2.1.1 本地缓存
本地缓存指的是应用内部的缓存,也叫进程缓存。最大的优点是应用和cache是在同一个进程内部,请求缓存快,没有过多的网络开销。本地缓存的有的很多,具体来说:

在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适;
缺点是缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费;
2.1.2 分布式缓存
分布式缓存是指缓存与应用本身分离,相比本地缓存来说,很明显的优点是分布式缓存本身就是一个独立的应用或组件,与本地应用隔离,多个应用可共享缓存。

2.2 独立缓存的问题
一般来说,如果系统对于高并发的业务需求并不是很敏感,单机部署时,考虑使用本地缓存即可满足;

常用的本地缓存组件包括:ehcache,caffeine,guawa等,这些都是成熟的方案,在不少互联网项目中都有实践落地经验,可以直接拿来使用;

但本地缓存在分布式部署时一个最大的问题就是缓存一致性的问题,所以在分布式部署模式下,通常考虑使用分布式缓存组件,避免一致性问题;

成熟的分布式缓存组件有:memcached,springcache,jetcache等;

对于一个生产中的应用来说,随着业务数据量的不断增加,独立缓存给应用的架构设计带来了越来越多的挑战,具体来说,表现如下:

2.2.1 缓存雪崩问题
以redis来说,如果对于key的使用不当,很容易出现的一个问题就是缓存雪崩问题,这在高并发的业务场景中是出现过生产事故的,简单来说就是,对于那些高频查询的热点接口缓存数据,,一旦使用不当很容易在某个时间点出现集中失效,造成缓存雪崩。

2.2.2 对宽带压力大
以分布式缓存为例,不管是使用memcached还是redis等存储缓存数据,一旦大量的请求过来查询缓存时,由于缓存是跨机器甚至跨网络,这必然会对当前应用的带宽造成瞬时的冲击。

2.2.3 运行效率低
试想,如果在分布式缓存前面再加上一层本地缓存,即JVM的进程缓存,那么数据到达服务端时,就可以直接从应用进程内部的缓存中获取数据,这比从远端获取redis的缓存效率就更高了。

2.3 多级缓存方案
多级缓存的搭配使用,不仅可以解决上面提到的问题,同时也给架构设计上带来了更多的发挥空间,多级缓存的业务流程如下:
本地缓存与多级缓存_第3张图片
浏览器访问静态资源时,优先读取浏览器本地缓存
访问非静态资源(ajax查询数据)时,访问服务端
请求到达Nginx后,优先读取Nginx本地缓存
如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat)
如果Redis查询未命中,则查询Tomcat
请求进入Tomcat后,优先查询JVM进程缓存
如果JVM进程缓存未命中,则查询数据库

2.3.1 多级缓存实践方案推荐
目前多级缓存在业内经过多年的实践总结,也有不少成熟的方案可供参考,如下提供几种常用的方案提供参考:

caffeine + redis

caffeine 是一款优秀的本地缓存组件,API丰富,灵活度高,而redis就不再过多介绍了,相信不少同学对redis都比较了解。

ehcache + redis

ehcache是一款老牌的本地缓缓组件,经过多年的生产实践,性能可靠、稳定、可配置化参数丰富。

guava-cache + redis

guava是google的一款轻量级的组件,在本地缓存的使用方面性能非常优异,使用成本也很低。

三、jetcache介绍
3.1 jetcache概述
jetcache是阿里开源的基于java开发的缓存框架,支持多种缓存类型:本地缓存、分布式缓存、多级缓存。能够满足不同业务场景的缓存需求。

jetcache具有上手简单、性能高效、拓展性强等特点。支持缓存预热 、缓存key前缀等功能。结合spring-cache使用,可以实现十分优雅的缓存类型切换。

官网地址:GitHub - alibaba/jetcache: JetCache is a Java cache framework.

官方文档:https://github.com/alibaba/jetcache/tree/master/docs/CN

3.2 jetcache 特性
JetCache是由阿里巴巴 Group 开源的一款基于 Spring 和 Redis 的分布式缓存框架。它的主要特点包括:

基于注解:通过注解的方式来实现缓存的配置和使用,代码简洁,易于维护;
多级缓存:支持多级缓存,可以将数据缓存在本地内存、Redis、Tair、Memcached 等多种缓存存储中,提高缓存的命中率和查询效率;
多种缓存协议:支持 Redis、Tair、Memcached 等多种缓存协议,具有良好的可扩展性和兼容性,可以灵活切换缓存存储方式;
高性能:JetCache 针对分布式环境下的高并发访问优化了缓存的数据结构和查询算法,提供了较高的性能;
易用性:JetCache 的 API 简单易用,支持 Spring 注入和自定义配置,提供了丰富的缓存操作功能,非常适合中小型应用开发;
3.3 jetcache 应用场景
3.3.1 热点数据缓存
JetCache 可以将常用的热点数据缓存在本地或远程缓存中,减少数据库或其他数据源的访问,并提高响应性能和性能稳定性。

相当于是同时融合了本地缓存与分布式缓存,开发者可以根据实际需求选择本地缓存或远程缓存进行配置使用。

3.3.2 多级缓存融合
JetCache 支持多种缓存存储类型,可以将不同的缓存存储类型融合使用,以达到更高的缓存效率和命中率。

在多级缓存中,通常需要多种技术的整合,而引入jetcache之后,可以避免应用中同时引入本地缓存和分布式缓存组件,只需要按照规范开启相关的配置参数即可满足。

3.3.3 支撑高并发读写
JetCache 的缓存算法可以优化高并发读写场景,提高程序性能并降低系统压力。

3.3.4 高速访问查询
JetCache 使用缓存,可以实现高速查询和访问,减少等待时间,并提高用户体验。

3.4 JetCache API使用
3.4.1 缓存管理
JetCache 提供了 CacheBuilder 类来创建缓存,以及 Cache 对象来操作缓存,例如 get、put、remove 等。在调用 Cache 对象的 put 方法时,可以使用注解 @Cache 来设置缓存时间和名称等配置。

3.4.2 注解支持
JetCache 提供了多种注解来实现缓存操作,例如 @Cached,@CacheUpdate, @CacheInvalidate 等。使用注解的方式,可以更加方便地进行缓存操作,例如缓存预热、删除、更新等。

3.4.3 缓存类型
JetCache 支持多种缓存类型,例如本地 memory、Redis、Tair 和 Memcached 等缓存,可以根据业务需求来选择缓存类型。

3.4.4 Spring 集成支持
JetCache 提供了 Spring 集成支持,可以通过注解来注入和配置缓存,简化使用流程。

四、jetcache与springboot整合应用
严格意来说,jetcache并不是一个缓存解决方案,只能说算是一个缓存框架,然后把别的缓存放到jetcache中管理,这样就可以支持AB缓存一起用了。并且jetcache参考了springboot整合缓存的思想,整体技术使用方式和springboot的缓存解决方案思想非常类似。

在正式开始使用jetcache之前需要明确一下,jetcache并不是随便拿两个缓存就能拼接在一起使用,目前jetcache支持的缓存方案中,本地缓存和远程缓存各支持2种类,分别如下:

4.1 缓存支持类型
4.1.1 本地缓存类型

1、LinkedHashMap;

2、Caffieine;

4.1.2 远程缓存支持类型

1、Redis;

2、Tair;

4.2 maven 依赖
下面的依赖为后文案例演示所有需要的基本依赖,如果单独测试jetcache功能,单独引包即可;

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId></dependency>
<!--<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId>
<version>2.6.2</version></dependency>-->
<dependency>
<groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.5.11</version>
</dependency><dependency><groupId>
redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency></dependencies>

4.3 本地缓存方案
4.3.1 application 配置文件
可以参考git文档进行相关参数配置,下面为基本的配置文件

jetcache:statIntervalMinutes: 1 #每过1分钟在控制台汇总一次数据areaInCacheName: falselocal:default:type: linkedhashmap

你可能感兴趣的:(others,缓存)