本文将由浅入深,从基本特性介绍,从简单demo使用,到JetCache源码分析,到Spring Aop的源码分析,到如何利用这些知识去自己尝试写一个自己的cache小demo,去做一个全面的概括。
*背景和特性
*用法demo
*JetCache源码分析
*Spring Aop的支持和源码分析
*写一个简单的cache框架demo
背景和特性
对于一些cache框架或产品,我们可以发现一些明显不足。
Spring cache:无法满足本地缓存和远程缓存同时使用,使用远程缓存时无法自动刷新
Guava cache:内存型缓存,占用内存,无法做分布式缓存
redis/memcache:分布式缓存,缓存失效时,会导致数据库雪崩效应
Ehcache:内存型缓存,可以通过RMI做到全局分布缓存,效果差
基于以上的一些不足,大杀器缓存框架JetCache出现,基于已有缓存的成熟产品,解决了上面产品的缺陷。主要表现在
(1)分布式缓存和内存型缓存可以共存,当共存时,优先访问内存,保护远程缓存;也可以只用某一种,分布式 or 内存
(2)自动刷新策略,防止某个缓存失效,访问量突然增大时,所有机器都去访问数据库,可能导致数据库挂掉
(3)利用不严格的分布式锁,对同一key,全局只有一台机器自动刷新
用法demo
可查看代码:https://github.com/zhuzhenke/common-caches/tree/master/jetcache
项目环境SpringBoot + jdk1.8+jetcache2.5.7
SpringApplication的main类注解,这个是必须要加的,否则jetCache无法代理到含有对应注解的类和方案
@SpringBootApplication
@ComponentScan("com.cache.jetcache")
@EnableMethodCache(basePackages = "com.cache.jetcache")
@EnableCreateCacheAnnotation
resource下创建application.yml
jetcache:
statIntervalMinutes: 1
areaInCacheName: false
local:
default:
type: linkedhashmap
keyConvertor: fastjson
remote:
default:
type: redis
keyConvertor: fastjson
valueEncoder: java
valueDecoder: java
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: 127.0.0.1
port: 6379
现在用CategoryService为例,介绍简单的用法
@Service
public class CategoryService {
@CacheInvalidate(name = CategoryCacheConstants.CATEGORY_DOMAIN,
key = "#category.getCategoryCacheKey()")
public int add(Category category) {
System.out.println("模拟进行数据库交互操作......");
System.out.println("Cache became invalid,value:" + CategoryCacheConstants.CATEGORY_DOMAIN
+ ",key:" + category.getCategoryCacheKey());
return 1;
}
@CacheInvalidate(name = CategoryCacheConstants.CATEGORY_DOMAIN,
key = "#category.getCategoryCacheKey()")
public int delete(Category category) {
System.out.println("模拟进行数据库交互操作......");
System.out.println("Cache became invalid,value:" + CategoryCacheConstants.CATEGORY_DOMAIN
+ ",key:" + category.getCategoryCacheKey());
return 0;
}
@CacheUpdate(name = CategoryCacheConstants.CATEGORY_DOMAIN,
value