文章目录
- 1、介绍
- 2、二级缓存下数据的读取与更新
- 3、整合
- 4、使用举例
- 5、配置的相关说明
- 6、小结
1、介绍
J2cache是一个缓存
整合框架
,可以提供缓存的整合方案,使各种缓存搭配使用,自身不提供缓存功能
。
-
J2cache是一个两次缓存的框架
-
第一级缓存L1使用内存,同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine,默认一级为Caffeine
-
第二级缓存L2使用 Redis(推荐)/Memcached,默认二级为Redis
-
由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此
L1 的目标是降低对 L2 的读取次数
。
J2Cache 从 1.3.0 版本开始支持 JGroups 和 Redis Pub/Sub 两种方式进行缓存事件的通知。在某些云平台上可能无法使用 JGroups 组播方式,可以采用 Redis 发布订阅的方式。详情请看 j2cache.properties 配置文件的说明。
2、二级缓存下数据的读取与更新
读取顺序:
L1 => L2 => DataBase
更新顺序:
- 从数据库中读取最新数据,依次更新 L1 -> L2
- 发送广播清除某个缓存信息
- 接收到广播(手工清除缓存 & 一级缓存自动失效)
- 从 L1 中清除指定的缓存信息
3、整合
以ehcache + redis为一二级缓存,进行整合。首先加入J2cache起步依赖坐标和核心依赖包:
<!--起步依赖-->
<dependency>
<groupId>net.oschina.j2cache</groupId>
<artifactId>j2cache-spring-boot2-starter</artifactId>
<version>2.8.0-release</version>
</dependency>
<!--j2cache的核心包(奇怪,干嘛不放起步依赖里)-->
<dependency>
<groupId>net.oschina.j2cache</groupId>
<artifactId>j2cache-core</artifactId>
<version>2.8.4-release</version>
</dependency>
注意,J2cache起步依赖里包含redis的起步依赖,这是因为J2cache框架的缓存技术默认使用的是Redis
加入缓存技术所对应的坐标,这里不用Redis,用ehcache:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
application.yaml中加入J2cache的配置:
j2cache:
config-location: j2cache.properties
写j2cache.properties文件,配置一级缓存与二级缓存以及一级缓存数据到二级缓存的发送方式
# 配置1级缓存
j2cache.L1.provider_class = ehcache
ehcache.configXml = ehcache.xml
# 配置2级缓存,注意这里的格式,别直接写redis,写供应商类的完整路径
j2cache.L2.provider_class = net.oschina.j2cache.cache.support.redis.SpringRedisProvider
j2cache.L2.config_section = redis # section,即区域,这里写redis,那下面的redis.xxx的配置就是给我这个二级缓存的,相当于一个前缀
redis.hosts = localhost:6379 # redis.开头,是我二级缓存的配置没错
# 即一级二级缓存之间同步数据怎么同步
# 配置1级缓存数据到2级缓存的广播方式:可以使用redis提供的消息订阅模式,也可以使用jgroups多播实现
j2cache.broadcast = net.oschina.j2cache.cache.support.redis.SpringRedisPubSubPolicy
PS,关于配置文件,在library中搜j2cache-core,即它的核心包,底下有文件范例,里面还有属性的解释,copy就行:
在需要的地方,注入CacheChannel缓存操作对象即可进行缓存数据操作
@Autowired
private CacheChannel cacheChannel;
4、使用举例
还是以上篇模拟手机验证码为例,演示验证码的存取⇒ set、get
@Service
public class SMSCodeServiceImpl implements SMSCodeService {
@Autowired
private CacheChannel cacheChannel;
@Override
public String sendCodeToSMS(String tele) {
String code = codeUtils.generator(tele);
cacheChannel.set("myarea",tele,code);
return code;
}
@Override
public boolean checkCode(String tele,String checkCode) {
String code = cacheChannel.get("myarea",tele).asString();
return checkCode.equals(code);
}
}
5、配置的相关说明
启动日志中发现有警告信息,前面日志框架学习时已经遇到过,SLF4J背后的日志实现技术导入了多种,绑定器发现有多个,这里显示最终使用了logback,那我们去从j2cache的starter中把slfj-simple的依赖排除掉就好。
再看日志,一级缓存、二级缓存中间有个redis模式为null的警告信息:
看下上面说的library下j2cache.properties的模板文件,可以直到这个就是Redis的模式选择,在自己的j2cache.properties里配下Redis的模式就可以处理掉这个警告信息。
还有一个配置:
redis.namespace = mySystemData
key前缀的分组的,默认为空,其余reids配置可自习查看模板文件。另外,还可以设置是否启用二级缓存:
j2cache.l2-cache-open = false # 关闭二级缓存
此时,数据只写往一级缓存,不再写入二级缓存redis
6、小结
到此缓存篇基本整理结束,缓存技术层有:
- simple
- ehcache
- redis
- memcached
- …
可整合缓存技术的缓存框架有:
- spring-cache
- jetcache
- j2cache