【开发篇】十三、J2cache缓存框架

文章目录

  • 1、介绍
  • 2、二级缓存下数据的读取与更新
  • 3、整合
  • 4、使用举例
  • 5、配置的相关说明
  • 6、小结

【开发篇】十三、J2cache缓存框架_第1张图片

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.j2cachegroupId>    
	<artifactId>j2cache-spring-boot2-starterartifactId>   
	<version>2.8.0-releaseversion>
dependency>


<dependency>    
	<groupId>net.oschina.j2cachegroupId>    
	<artifactId>j2cache-coreartifactId>    
	<version>2.8.4-releaseversion>
dependency>

注意,J2cache起步依赖里包含redis的起步依赖,这是因为J2cache框架的缓存技术默认使用的是Redis

【开发篇】十三、J2cache缓存框架_第2张图片

加入缓存技术所对应的坐标,这里不用Redis,用ehcache:

<dependency>    
	<groupId>net.sf.ehcachegroupId>    
	<artifactId>ehcacheartifactId>
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就行:

【开发篇】十三、J2cache缓存框架_第3张图片

在需要的地方,注入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的模式就可以处理掉这个警告信息。

【开发篇】十三、J2cache缓存框架_第4张图片

还有一个配置:

redis.namespace = mySystemData

key前缀的分组的,默认为空,其余reids配置可自习查看模板文件。另外,还可以设置是否启用二级缓存:

j2cache.l2-cache-open = false # 关闭二级缓存

此时,数据只写往一级缓存,不再写入二级缓存redis

6、小结

到此缓存篇基本整理结束,缓存技术层有:

  • simple
  • ehcache
  • redis
  • memcached

可整合缓存技术的缓存框架有:

  • spring-cache
  • jetcache
  • j2cache

你可能感兴趣的:(SpringBoot,缓存,bootstrap,前端)