本文目录

一、J2Cache简介

二、数据读取

三、使用方法及实际示例

3.1 引用 Maven

3.2 准备配置

3.3 编写代码

3.3.1 Demo示例

3.3.2 实际案例

四、常见问题

4.1 J2Cache 的使用场景是什么?

4.2 为什么不能在程序中设置缓存的有效期

4.3 如何使用 memcached 作为二级缓存

4.4 使用何种 Redis 的存储模式最佳? generic 还是 hash ?


一、J2Cache简介

J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求至少 Java 8)。第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memcached 。 由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。 该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的缓存冷启动后对后端业务的冲击。

J2Cache 从 1.3.0 版本开始支持 JGroups 和 Redis Pub/Sub 两种方式进行缓存事件的通知。在某些云平台上可能无法使用 JGroups 组播方式,可以采用 Redis 发布订阅的方式。详情请看 j2cache.properties 配置文件的说明。

视频介绍:http://v.youku.com/v_show/id_XNzAzMTY5MjUy.html

J2Cache 的两级缓存结构

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

二、数据读取

  1. 读取顺序 -> L1 -> L2 -> DB

  2. 数据更新

    1 从数据库中读取最新数据,依次更新 L1 -> L2 ,发送广播清除某个缓存信息
    2 接收到广播(手工清除缓存 & 一级缓存自动失效),从 L1 中清除指定的缓存信息

三、使用方法及实际示例

J2Cache 默认使用 Caffeine 作为一级缓存,使用 Redis 作为二级缓存。你还可以选择 Ehcache2 和 Ehcache3 作为一级缓存。

以下实际的使用示例是以Springboot 项目为基础集成 J2Cache 的。

3.1 引用 Maven

以下是我从中央仓库查看的2.8.x的版本

        <!-- https://mvnrepository.com/artifact/net.oschina.j2cache/j2cache-core --><dependency><groupId>net.oschina.j2cache</groupId><artifactId>j2cache-core</artifactId><version>2.8.2-release</version></dependency>

3.2 准备配置

拷贝 j2cache.properties 和 caffeine.properties 到你项目的源码目录,并确保这些文件会被编译到项目的 classpath 中。如果你选择了 ehcache 作为一级缓存,需要拷贝 ehcache.xml 或者 ehcache3.xml 到源码目录(后者对应的是 Ehcache 3.x 版本),这些配置文件的模板可以从 https://gitee.com/ld/J2Cache/tree/master/core/resources 这里获取。

使用你喜欢的文本编辑器打开 j2cache.properties 并找到 redis.hosts 项,将其信息改成你的 Redis 服务器所在的地址和端口。

我们建议缓存在使用之前都需要预先设定好缓存大小及有效时间,使用文本编辑器打开 caffeine.properties 进行缓存配置,配置方法请参考文件中的注释内容。

例如:default = 1000,30m #定义缓存名 default ,对象大小 1000,缓存数据有效时间 30 分钟。 你可以定义多个不同名称的缓存。

自己代码中实际的配置文件已上传至资源中心,方便查看:

J2Cache 使用Ceffien作为一级缓存,使用Redis作为二级缓存时的配置

3.3 编写代码

3.3.1 Demo示例

public static void main(String[] args) {CacheChannel cache = J2Cache.getChannel();// 缓存操作cache.set("default", "1", "Hello J2Cache");System.out.println(cache.get("default", "1"));// 清除缓存cache.evict("default", "1");System.out.println(cache.get("default", "1"));// 请注意 cache.close() 方法只需在程序退出时调用cache.close();
}

3.3.2 实际案例

    /*** 获取摄像头的uuid** @param sn       家庭的sn* @param deviceId 像头的设备id* @return 摄像头的uuid*/private String getUuid(String sn, Integer deviceId) {log.info("E|CameraShoutHandler|getUuid()|根据sn和摄像头的设备id调用设备云服务查询摄像头详情开始!");long startTime = System.currentTimeMillis();// 格式 dev225:132String key = sn + StrUtil.COLON + deviceId;CacheChannel channel = J2Cache.getChannel();// 先从缓存中取出摄像头的UUID(首先从内存中读取,内存中如果没有再从Redis中读取,如果Redis还是没有,那么就再去数据库或者调用第三方服务获取数据)CacheObject cacheObject = channel.get(SystemConstant.APPLICATION_NAME, key);String uuid = (String) cacheObject.getValue();// 如果两级缓存中没有摄像头的uuid,则去调用设备云服务查询摄像头的详情,查询出之后再存入缓存if (Objects.isNull(uuid)) {log.info("**************** 缓存中的UUID为空,调用设备云服务查询摄像头的uuid *************");CommResponse cameraDetailInfo = cameraDetailInfoRpc.getCameraDetailInfo(sn, deviceId);CameraDetailInfoDTO cameraDetailInfoDTO = (CameraDetailInfoDTO) cameraDetailInfo.getData();// 存入缓存channel.set(SystemConstant.APPLICATION_NAME, key, cameraDetailInfoDTO.getUuid());}log.info("E|CameraShoutHandler|getUuid()|根据sn和摄像头的设备id调用设备云服务查询摄像头详情结束!------------ 耗时:【{}】毫秒!", System.currentTimeMillis() - startTime);return uuid;}

可以从Redis客户端工具里查看,Redis中已经有这个数据了。

四、常见问题

4.1 J2Cache 的使用场景是什么?

首先你的应用是运行在集群环境,使用 J2Cache 可以有效降低节点间的数据传输量;其次单节点使用 J2Cache 可以避免应用重启后对后端业务系统的冲击

4.2 为什么不能在程序中设置缓存的有效期

在程序中定义缓存数据的有效期会导致缓存不可控,一旦数据出问题无从查起,因此 J2Cache 的所有缓存的有效期都必须在 一级缓存 的配置中预设好再使用

4.3 如何使用 memcached 作为二级缓存

首先修改 j2cache.properties 中的 j2cache.L2.provider_class 为 memcached,然后在 j2cache.properties 中配置 memcached.xxx 相关信息。

需要在项目中引入对 memcached 的支持:

<dependency><groupId>com.googlecode.xmemcached</groupId><artifactId>xmemcached</artifactId><version>2.4.5</version>
</dependency>

4.4 使用何种 Redis 的存储模式最佳? generic 还是 hash ?

我们推荐使用 generic 存储模式,这也是 J2Cache 默认的存储模式,hash 模式最大的问题是无法单独对 key 进行 expire 设置。

参考资料:J2Cache —— 基于内存和 Redis 的两级 Java 缓存框架

完结!

【缓存】J2Cache —— 基于内存和 Redis 的两级 Java 缓存框架的使用方法相关推荐

  1. 【Caffeine进阶】Redis+Caffeine 两级缓存实战,性能爆缸

    往期回顾 博主前面发过一篇[缓存框架Caffeine]初级篇,主要介绍了Caffeine的入门级使用!地址https://blog.csdn.net/Number_oneEngineer/articl ...

  2. Redis+Caffeine两级缓存

    1.前言 在高性能的服务架构设计中,缓存是一个不可或缺的环节.在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库.在提升 ...

  3. Redis一(缓存的工作原理、redis的介绍、hashmap缓存)

    文章目录 一.缓存 二.redis 三.hashmap模拟缓存工作原理 1)首先查看数据库中存储的数据格式 2)连接数据库,利用spring在浏览器中显示 3)测试,运行spring接口 一.缓存 当 ...

  4. Excel制作两级分类级联的一种方法

    用Excel制作可筛选的两级分类自动级联 准备二级分类的字典表 在excel的里sheet里准备一级和二级分类的字典表(比如命名:字典及步骤),比如这里的能源行业是一级分类,而能源设备.石油天然气.煤 ...

  5. 基于内存,redis,mysql的高速游戏数据服务器设计架构

    1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改. 数据层次上分为:内存数据,redis数据,mysql数据 设计目的:首先保证数据的可靠,防止数据丢失, ...

  6. 基于PCA的特征提取和两级匹配的激光雷达SLAM(翻译)

    同时定位和建图(SLAM)在机器人领域已经研究了几十年,其中光探测和测距(LiDAR)由于其可直接.准确和可靠的三维测量而广泛应用于各种应用领域.然而,当在退化场景中运行时,LiDAR SLAM的性能 ...

  7. layui生产管理系统_分享两款Java Spring框架的开源MES制造执行系统

    随着工业互联网.智能制造的快速发展,MES制造执行系统的需求量也渐渐变大,有不少软件企业或者互联网企业都在做一块,现在可谓是百家争鸣.在国内影响力比较大的MES企业有SAP(思爱普).Siemens( ...

  8. 工业检测:基于密集尺度特征融合像素级不平衡学习框架(论文下载)

    关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 论文地址:https://arxiv.org/pdf/2203.09387v1 ...

  9. J2cache两级缓存原理

    1.关于开源中国的一些数据 2.OSChina的几种缓存策略 3.Ehcache缓存架构 4.实际运行存在的问题 5.混村系统选型时的考量 6.J2Cache--两级缓存框架(内存,磁盘) 每天 IP ...

  10. 高性能两级缓存J2Cache

    今天给大家推荐一个开源项目,J2Cache,一个很完善的两级缓存项目,作者是-红薯(开源中国CTO) 介绍 开源项目地址:https://gitee.com/ld/J2Cache/tree/maste ...

最新文章

  1. 让你的输入框使用Google云语音输入技术
  2. 华北科技学院计算机系综合性实验,华北科技学院计算机系综合性实验.doc
  3. [原创]红马版验证码实现(中文+变形+噪点)
  4. UBUNTU给已有用户改名
  5. c#windfrom打包_WinForm程序打包教程
  6. 数字电路逻辑符号和逻辑图形符号
  7. C# 匿名函数_C# 匿名函数使用整理
  8. 2022哈尔滨工程大学软件工程上岸经验贴
  9. Android带动画进度条简单实现
  10. WebGL入门(十二)-使用varying变量在顶点着色器给片元着色器传值,绘制彩色三角形
  11. [转] 大三下,我们该做什么?
  12. 【计算机网络】,java基础教程从入门到精通
  13. js 屏蔽原生鼠标和键盘事件
  14. 解决PPT不能插入页码问题
  15. List.isEmpty()与CollectionUtils.isEmpty的区别
  16. 电商野史:中酒网CEO 顾建兴
  17. Baize_ServoDriver_esp8266-(arduino32路舵机驱动板)(开源可自制,附程序和固件以及烧录方法)
  18. java网店系统_关于java网店系统的404页面 你知道多少
  19. 手机显示无法接通服务器是怎么回事,手机暂时无法接通是什么原因 可能处于飞行模式...
  20. TightVNC怎么退出全屏

热门文章

  1. 将Excel文件数据导入到Oracle
  2. 利用CMD命令关闭进程
  3. 【银河麒麟V10】【桌面】安装虚拟pdf打印机
  4. 利用虚拟打印机截取打印文件并上传到服务器
  5. 一个大牛写的有关游戏的
  6. 单片机仿真软件Proteus Pro 8.9版本License过期
  7. 人人影视路由二代刷Breed
  8. 北斗系统基础知识0(专家解析:北斗卫星导航通信系统起源与发展工作原理)
  9. html网页生成工具
  10. 快速傅里叶变换蝶式运算 matlab,FFT快速傅里叶变换(蝶形算法)详解.ppt