J2Cache的学习

此教程基于黑马程序员Java品达通用权限项目,哔哩哔哩链接:https://www.bilibili.com/video/BV1tw411f79E?p=97

一、j2cache介绍

j2cache是OSChina(开源中国)目前正在使用的两级缓存框架。

j2cache的两级缓存结构:

  • L1: 进程内缓存 caffeine/ehcache
  • L2: 集中式缓存 Redis/Memcached

j2cache其实并不是在重复造轮子,而是作资源整合,即将Ehcache、Caffeine、redis、Spring Cache等进行整合

由于大量的缓存读取会导致L2的网络成为整个系统的瓶颈,因此L1的目标是降低对L2的读取次数,因为L1是进程内的,读取数据没有网络开销,性能更高

该缓存框架主要用于集群环境中,单机也可使用,用于避免应用重启导致的ehcache缓存数据丢失。

j2cache从1.3.0版本开始支持JGroups和Redis Pub/Sub两种方式进行缓存事件的通知。

数据读取顺序 -> L1 -> L2 -> DB(数据库)

使用j2cache需要导入的maven坐标:

<dependency><groupId>net.oschina.j2cache</groupId><artifactId>j2cache-spring-boot2-starter</artifactId><version>2.8.0-release</version>
</dependency>
<dependency><groupId>net.oschina.j2cache</groupId><artifactId>j2cache-core</artifactId><version>2.8.0-release</version><!-- 排除 --><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion></exclusions>
</dependency>

二、j2cache入门案例

第一步:创建maven工程j2cache_demo并配置pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/></parent><groupId>cn.itcast</groupId><artifactId>j2cache_demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 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.0-release</version><!-- 排除 --><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion></exclusions></dependency></dependencies></project>

第二步:创建application.yml

server:port: 9000
# redis 通用配置, 不同的环境,需要配置不同的链接信息,
# 只需要将这段信息复制到具体环境的配置文件中进行修改即可
# 如:复制到pd-auth-server-dev.yml中将数据库名和ip改掉
pinda:redis:ip: 127.0.0.1port: 6379password:database: 0 # 使用0号数据库spring:cache:type: GENERICredis:host: ${pinda.redis.ip}password: ${pinda.redis.password}port: ${pinda.redis.port}database: ${pinda.redis.database}j2cache:#  config-location: /j2cache.propertiesopen-spring-cache: truecache-clean-mode: passiveallow-null-values: trueredis-client: lettuce #指定redis客户端使用lettuce,也可以使用Jedisl2-cache-open: true #开启二级缓存,false则表示只使用一级缓存# 事件通知的机制,j2cache从1.3.0版本开始支持JGroups和Redis Pub/Sub两种方式进行缓存事件的通知。# 此处我们使用基于redis的发布订阅模式来通知缓存的各个节点来进行缓存数据的同步(由j2cache进行实现,我们写上配置即可)broadcast: net.oschina.j2cache.cache.support.redis.SpringRedisPubSubPolicy#  broadcast: jgroupsL1: #指定一级缓存提供者为caffeineprovider_class: caffeineL2: #指定二级缓存提供者为redisprovider_class: net.oschina.j2cache.cache.support.redis.SpringRedisProviderconfig_section: lettucesync_ttl_to_redis: truedefault_cache_null_object: falseserialization: fst
caffeine:properties: /caffeine.properties   # 这个配置文件需要放在项目中
# lettuce是redis的一个客户端,也可以使用jedis,都是用来操作redis的java客户端
lettuce:mode: singlenamespace:storage: genericchannel: j2cachescheme: redishosts: ${pinda.redis.ip}:${pinda.redis.port}password: ${pinda.redis.password}database: ${pinda.redis.database}sentinelMasterId:maxTotal: 100maxIdle: 10minIdle: 10timeout: 10000

第三步:创建/resources/caffeine.properties文件

#########################################
# Caffeine configuration
# [name] = size, xxxx[s|m|h|d]
#########################################
# 默认区域,最多可以放入2000个缓存对象,缓存2个小时的时间,s表示秒,m分钟,h小时,d天
default=2000, 2h
# 定义的第二个缓存的区域,名字任意,此处为rx,最多存放50个缓存对象,缓存2个小时,时间到就会自动清除缓存
rx=50, 2h

第四步:创建MyController

package cn.itcast.controller;import net.oschina.j2cache.CacheChannel;
import net.oschina.j2cache.CacheObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("/cache")
public class MyController {private String key = "myKey"; // 定义缓存的keyprivate String region="rx"; // 缓存的区域// 我们使用j2chache提供的CacheChannel来操作我们的缓存数据/** 为什么我们没有配置就可以直接注入CacheChannel,因为我们导入了j2cache的坐标,他会帮我们自动完成配置* 自动加载我们在application.yml中的配置,把CacheChannel实例化出来,并且载入spring容器* */@Autowiredprivate CacheChannel cacheChannel;// 放入缓存(一级缓存和二级缓存都会放入)@GetMapping("/getInfos")public List<String> getInfos(){CacheObject cacheObject = cacheChannel.get(region, key);if(cacheObject.getValue() == null){//缓存中没有找到,查询数据库获得List<String> data = new ArrayList<String>();data.add("info1");data.add("info2");//放入缓存,指定区域,key,数据cacheChannel.set(region,key,data);return data;}return (List<String>) cacheObject.getValue();}//清理指定缓存(一级缓存和二级缓存都会清理)@GetMapping("/evict")public String evict(){cacheChannel.evict(region,key);return "evict success";}//清理指定区域的缓存(会把整个区域的缓存进行清理掉,(一级缓存和二级缓存都会清理))@GetMapping("/clear")public String clear(){cacheChannel.clear(region);return "clear success";}//检测缓存数据是否存在@GetMapping("/exists")public String exists(){boolean exists = cacheChannel.exists(region, key);return "exists:" + exists;}// 检测指定的缓存数据是从哪一级缓存获取到的,如果两级缓存都没有数据,则返回为0@GetMapping("/check")public String check(){int check = cacheChannel.check(region, key);return "level:" + check;}
}

第五步:创建启动类

package cn.itcast;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class J2CacheApp {public static void main(String[] args) {SpringApplication.run(J2CacheApp.class,args);}
}

注意:由于我们当前第二级缓存使用的是redis,所以需要启动redis服务才能正常运行入门案例。

启动项目,访问地址:http://localhost:9000/cache/getInfos ,使用redis可视化工具RDM可以发现redis中已经缓存了数据:

且获取数据首先是从一级缓存中进行缓存,

重启项目,由于j2cache的一级缓存(caffeine)是进程级缓存,重启后一级缓存消失。但是二级缓存(redis)的数据还存在,再次访问 http://localhost:9000/cache/getInfos,通过debug断点调试可以看到程序从redis中获取了缓存数据。

三、starter定制及使用

​ 我们可以开发一个starter,名字为pd-tools-j2cache,我们的应用直接引入其maven坐标并配置j2cache的配置文件就可以将CacheChannel对象直接注入到我们的程序中进行缓存数据操作了。具体使用过程和入门案例一致,只需要更换j2cache的maven坐标为pd-tools-j2cache的maven坐标即可。

​ starter模块的定制可以参考b站链接:https://www.bilibili.com/video/BV1tw411f79E?p=103&spm_id_from=pageDriver,此处我们不做过多叙述

喜欢请关注我

至此,我们的J2Cache的学习就讲解完毕了。喜欢我的话可以关注我的微信公众号 我爱学习呀嘻嘻 ,不定期分享各类资源哦。

J2Cache的学习相关推荐

  1. 开源java项目_请问有哪些开源java项目值得学习的?学习完了容易找工作的?

    Gitee 小编精选了六个 GItee 上的 GVP(Gitee Most Valuable Project) Java 开源项目,种类丰富,覆盖各行各业,希望可以帮到你:) 更多值得学习的优质开源项 ...

  2. Netty学习开发之路

    Netty学习 前言简介 ======= 我们公司最近决定做个基于netty tcp的IM程序,由于最近项目比较紧张,所以没办法,只能我和另外一个做安卓的同事一起学习开发.在这里先说一句瓜皮呦!而且项 ...

  3. SpringBoot整合第三方技术学习笔记(自用)

    SpringBoot整合第三方技术学习笔记 搬运黑马视频配套笔记 KF-4.数据层解决方案 KF-4-1.SQL 回忆一下之前做SSMP整合的时候数据层解决方案涉及到了哪些技术?MySQL数据库与My ...

  4. 本文记录Alone学习的知识点

    本文总结Alone学习的知识点 1.学习的github地址 2. Java多线程 3. java8新特性 4. SpringCloud第一代 5. SpringCloud第二代 6. 算法类 7.Ja ...

  5. java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】

    类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...

  6. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  7. FastAI 2019课程学习笔记 lesson 2:自行获取数据并创建分类器

    文章目录 数据获取 google_images_download 的安装和使用 挂载google 个人硬盘到Google colab中 删除不能打开文件 创建ImageDataBunch 训练模型 解 ...

  8. FastAI 课程学习笔记 lesson 1:宠物图片分类

    文章目录 代码解析 神奇的"%" 导入fastAI 库 下载解压数据集 untar_data 获取帮助文档 help() ? ?? doc 设置路径 get_image_files ...

  9. 深度学习学习指南-工具篇

    colab Colab是由Google提供的云计算服务,通过它可以让开发者很方便的使用google的免费资源(CPU.GPU.TPU)来训练自己的模型. 学习经验总结 如何使用命令行? 通过!+cmd ...

  10. Redis学习之路(一)--下载安装redis

    redis学习之路--下载安装redis windows安装redis 1.下载redis 2.安装 3.查看是否安装成功 windows安装redis 1.下载redis 网址:https://gi ...

最新文章

  1. QIIME 2教程. 16纵向和成对样本比较q2-longitudinal(2021.2)
  2. 可以获取python整数类型帮助的是什么-下列选项中可以获取Python整数类型帮助的是()。...
  3. lingo变量无限制版本_Quicker 0.10.7 版本发布
  4. web开发的一些工具技巧_有用的技巧可帮助您建立Web开发人员的良好习惯
  5. NeurIPS 2021 Spotlight | PCAN: 高效时序建模, 提升多目标追踪与分割性能
  6. python与机器学习(五)——决策树
  7. sublime 3 3083验证码
  8. 唯一被图灵求婚的女人,与他并肩破译纳粹德国 Enigma 密码,拯救千万人生命!| 人物志...
  9. AppStore下载Xcode的文件
  10. matlab算法knn算法,MATLAB KNN算法
  11. linux kvm 的虚拟机处于暂停状态怎么开机 和 KVM-Virsh指令
  12. matlab 绘制三维实体,matlab 三维绘制
  13. ajax多个分页,通过Ajax与kaminari进行多重分页
  14. 利用火狐浏览器伪造IP地址,把自己IP改成美国
  15. #4508. Triples I
  16. 【阿里内部教程】python初阶:基础语法 python全栈自动化测试系类
  17. idea常用的十八个设置(程序员必会)
  18. 日常安全运营工作的一些思考
  19. 笔记:在CentOS上开始你的工作
  20. 数据库系统概论——数据库安全性控制

热门文章

  1. appkey、appSecret自动生成
  2. mil和mm之间的换算
  3. spring cloud SnakeYAML RCE 漏洞复现
  4. 没想到,快手成了“生产力”
  5. linux修改系统语言为中文
  6. linux 中文乱码 解决方法
  7. PTAM + OpenCV3.4.1 + Ubuntu16.04
  8. 有关产品项目管理的ISO/IEC/IEEE标准
  9. 《麦肯锡·卓越工作方法》
  10. 软硬件协同仿真——硬件加速