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



    请添加图片描述

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    在这里插入图片描述

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

    <dependency>    
    	<groupId>net.sf.ehcachegroupId>    
    	<artifactId>ehcacheartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    application.yaml中加入J2cache的配置:

    j2cache:  
      config-location: j2cache.properties
    
    
    • 1
    • 2
    • 3

    写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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    PS,关于配置文件,在library中搜j2cache-core,即它的核心包,底下有文件范例,里面还有属性的解释,copy就行:

    在这里插入图片描述

    在需要的地方,注入CacheChannel缓存操作对象即可进行缓存数据操作

    @Autowired
    private CacheChannel cacheChannel;
    
    • 1
    • 2

    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);    
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    5、配置的相关说明

    启动日志中发现有警告信息,前面日志框架学习时已经遇到过,SLF4J背后的日志实现技术导入了多种,绑定器发现有多个,这里显示最终使用了logback,那我们去从j2cache的starter中把slfj-simple的依赖排除掉就好。
    在这里插入图片描述

    再看日志,一级缓存、二级缓存中间有个redis模式为null的警告信息:

    在这里插入图片描述

    看下上面说的library下j2cache.properties的模板文件,可以直到这个就是Redis的模式选择,在自己的j2cache.properties里配下Redis的模式就可以处理掉这个警告信息。

    在这里插入图片描述

    还有一个配置:

    redis.namespace = mySystemData
    
    • 1

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

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

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

    6、小结

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

    • simple
    • ehcache
    • redis
    • memcached

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

    • spring-cache
    • jetcache
    • j2cache
  • 相关阅读:
    汽车屏类产品(三):抬头显示Head-Up Display(HUD)
    远程端点管理和安全性
    大疆Tello UDP控制协议接口
    minikube 快速使用入门
    匿名用户上传的Mybatis学习笔记,炸来了阿里P8,网上一片好评
    nothing added to commit but untracked files present (use“git add“to track)
    redis stream 实现消息队列
    荣耀回应强迫员工购买股份:不实消息;​微软为Win11 引入云操作系统;苹果定于6月6日举行开发者大会 |极客头条
    ​软考-高级-信息系统项目管理师教程 第四版【第17章-项目干系人管理-思维导图】​
    金仓数据库 KingbaseGIS 使用手册(8.11. 栅格处理函数)
  • 原文地址:https://blog.csdn.net/llg___/article/details/133498821