热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于内存和Redis的两级Java缓存框架!

👇👇关注后回复“进群”,拉你进程序员交流群👇👇Java两级缓存框架,可以让应用支持两级缓

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

Java 两级缓存框架,可以让应用支持两级缓存框架 ehcache(Caffeine) + redis 。避免完全使用独立缓存系统所带来的网络IO开销问题

基于内存和 Redis 的两级 Java 缓存框架

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

J2Cache 的两级缓存结构

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

数据读取

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

  2. 数据更新

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

J2Cache 配置

配置文件位于 core/resources 目录下,包含三个文件:

  • j2cache.properties J2Cache 核心配置文件,可配置两级的缓存,Redis 服务器、连接池以及缓存广播的方式

  • caffeine.properties  如果一级缓存选用 Caffeine ,那么该文件用来配置缓存信息

  • ehcache.xml Ehcache 的配置文件,配置说明请参考 Ehcache 文档

  • ehcache3.xml Ehcache3 的配置文件,配置说明请参考 Ehcache 文档

  • network.xml JGroups 网络配置,如果使用 JGroups 组播的话需要这个文件,一般无需修改

实际使用过程需要将所需的配置文件复制到应用类路径中,如 WEB-INF/classes 目录。

J2Cache 运行时所需 jar 包请查看 core/pom.xml

测试方法

  1. 安装 Redis  

  2. git clone https://gitee.com/ld/J2Cache

  3. 修改 core/resource/j2cache.properties 配置使用已安装的 Redis 服务器

  4. 在命令行中执行 mvn package -DskipTests=true 进行项目编译

  5. 打开多个命令行窗口,同时运行 runtest.sh

  6. 在 > 提示符后输入 help 查看命令,并进行测试

使用方法

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

准备工作

  1. 安装 Redis

  2. 新建一个基于 Maven 的 Java 项目

一. 引用 Maven

net.oschina.j2cache  j2cache-core  xxxxx  

中央仓库地址:>>飞机

二. 准备配置

拷贝 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 分钟。你可以定义多个不同名称的缓存。

三. 编写代码

Test.java

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();
}

编译并运行查看结果,更多的用法请参考 CacheChannel.java 接口的方法。

请注意 cache.close() 方法只需在程序退出时调用。

四. 动态构建 J2Cache 实例

J2CacheConfig config = new J2CacheConfig();
//填充 config 变量所需的配置信息
J2CacheBuilder builder = J2CacheBuilder.init(config);
CacheChannel channel = builder.getChannel();
//进行缓存的操作
channel.close();

五. 集群测试

为了方便测试集群模式下 J2Cache 的运行,我们提供了一个命令行小程序,请参考此页面前面的 “测试方法”。

常见问题

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

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

  3. 如何使用 JGroups 组播方式(无法在云主机中使用)  
    首先修改 j2cache.properties 中的 j2cache.broadcast 值为 jgroups,然后在 maven 中引入

    org.jgroupsjgroups3.6.13.Final

  4. 如何使用 ehcache 作为一级缓存  
    首先修改 j2cache.properties 中的 j2cache.L1.provider_class 为 ehcache 或者 ehcache3,然后拷贝 ehcache.xml 或者 ehcache3.xml 到类路径,并配置好缓存,需要在项目中引入对 ehcache 的支持:

    net.sf.ehcacheehcache2.10.4
    org.ehcacheehcache3.4.0

  5. 如何使用 RabbitMQ 作为消息通知  
    首先修改 j2cache.properties 中的 j2cache.broadcast 为 rabbitmq,然后在 j2cache.properties 中配置 rabbitmq.xxx 相关信息。

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

    com.rabbitmqamqp-client5.3.0

  6. 如何使用 RocketMQ 作为消息通知  
    首先修改 j2cache.properties 中的 j2cache.broadcast 为 rocketmq,然后在 j2cache.properties 中配置 rocketmq.xxx 相关信息。

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

    org.apache.rocketmqrocketmq-client4.3.0provided

  7. 如何使用 memcached 作为二级缓存  
    首先修改 j2cache.properties 中的 j2cache.L2.provider_class 为 memcached,然后在 j2cache.properties 中配置 memcached.xxx 相关信息。

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

    com.googlecode.xmemcachedxmemcached2.4.5

  8. 为什么 J2Cache 初始化时,连接本机的 Redis 非常慢,要 5 秒以上?

    如果出现这种情况,请在系统 hosts 里配置机器名和IP地址的对应关系,例如:

    127.0.0.1       localhost
    127.0.0.1       winter-notebook.local
    ::1             localhost
    ::1             winter-notebook.local

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

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

项目地址

github地址:https://gitee.com/ld/J2Cache

-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

f64997b2844bbbce5cf94c81682c4a6d.png

点击👆卡片,关注后回复【面试题】即可获取

在看点这里041864d6404061b51102242b4be746e6.gif好文分享给更多人↓↓


推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
author-avatar
低契一巴掌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有