当前位置: 首页 > news >正文

j2cache入门使用

j2cache入门使用

1 、j2cache介绍

j2cache是OSChina目前正在使用的两级缓存框架。

j2cache的两级缓存结构:

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

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

由于大量的缓存读取会导致L2的网络成为整个系统的瓶颈,因此L1的目标是降低对L2的读取次数。该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的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>

2、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>com.zcl</groupId>
    <artifactId>j2cache_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
    </dependencies>
</project>

第二步:创建application.yml

server:
  port: 9000
# redis 通用配置, 不同的环境,需要配置不同的链接信息,
# 只需要将这段信息复制到具体环境的配置文件中进行修改即可
# 如:复制到pd-auth-server-dev.yml中将数据库名和ip改掉
pinda:
  redis:
    ip: 127.0.0.1
    port: 6379
    password:
    database: 0

spring:
  cache:
    type: GENERIC
  redis:
    host: ${pinda.redis.ip} # 引用配置文件中的信息
    password: ${pinda.redis.password}
    port: ${pinda.redis.port}
    database: ${pinda.redis.database}

j2cache:
  #  config-location: /j2cache.properties
  open-spring-cache: true
  cache-clean-mode: passive
  allow-null-values: true
  redis-client: lettuce #指定redis客户端使用lettuce,也可以使用Jedis
  l2-cache-open: true #开启二级缓存
  broadcast: net.oschina.j2cache.cache.support.redis.SpringRedisPubSubPolicy
  #  broadcast: jgroups
  L1: #指定一级缓存提供者为caffeine
    provider_class: caffeine 
  L2: #指定二级缓存提供者为redis
    provider_class: net.oschina.j2cache.cache.support.redis.SpringRedisProvider
    config_section: lettuce
  sync_ttl_to_redis: true
  default_cache_null_object: false
  serialization: fst
caffeine:
  properties: /caffeine.properties   # 这个配置文件需要放在项目中
lettuce:
  mode: single
  namespace:
  storage: generic
  channel: j2cache
  scheme: redis
  hosts: ${pinda.redis.ip}:${pinda.redis.port}
  password: ${pinda.redis.password}
  database: ${pinda.redis.database}
  sentinelMasterId:
  maxTotal: 100
  maxIdle: 10
  minIdle: 10
  timeout: 10000

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

第一缓存区域,以及缓存时间
例如:rx=50,2H(rx区域可以缓存50个对象,缓存2小时清理)

#########################################
# Caffeine configuration
# [name] = size, xxxx[s|m|h|d]
#########################################
default=2000, 2h
rx=50, 2h

第四步:创建MyController

package com.zcl.controller;

import net.oschina.j2cache.CacheChannel;
import net.oschina.j2cache.CacheObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 描述:使用j2cache提供的CacheChannel对象作为缓存数据
 *
 * @author zhong
 * @date 2022-09-01 8:08
 */
@RestController
@RequestMapping("/user")
public class UserController {
    // 存储密钥
    private String key = "myKey";
    // 缓存区域
    private String region = "rx";

    /**
     * 注入j2cache对象
     */
    @Resource
    private CacheChannel cacheChannel;

    /**
     * 写入缓存
     * @return
     */
    @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");
            //放入缓存
            cacheChannel.set(region,key,data);
            return data;
        }
        return (List<String>) cacheObject.getValue();
    }
}

第五步:创建启动类

package com.zcl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 描述:启动类
 *
 * @author zhong
 * @date 2022-09-01 8:16
 */
@SpringBootApplication
public class J2CacheApp {
    public static void main(String[] args) {
        SpringApplication.run(J2CacheApp.class,args);
    }
}

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

启动项目,访问地址:http://localhost:9000/cache/getInfos

可以发现redis中已经缓存了数据:
在这里插入图片描述

重启项目,再次访问

如果项目存储保存之后再次请求,获取的数据还是在一级缓存中获取
重启项目,由于j2cache的一级缓存(caffeine)是进程级缓存,重启后一级缓存消失。但是二级缓存(redis)的数据还存在,再次访问上面地址,通过debug断点调试可以看到程序从redis中获取了缓存数据。【lervel=2】

在这里插入图片描述

第六步、完成控制器的开发

在原来的基础上进行添加控制器接口,测试时指定请求接口即可

package com.zcl.controller;

import net.oschina.j2cache.CacheChannel;
import net.oschina.j2cache.CacheObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 描述:使用j2cache提供的CacheChannel对象作为缓存数据
 *
 * @author zhong
 * @date 2022-09-01 8:08
 */
@RestController
@RequestMapping("/user")
public class UserController {
    // 存储密钥
    private String key = "myKey";
    // 缓存区域
    private String region = "rx";

    /**
     * 注入j2cache对象
     */
    @Resource
    private CacheChannel cacheChannel;

    /**
     * 写入缓存
     * @return
     */
    @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");
            //放入缓存
            cacheChannel.set(region,key,data);
            return data;
        }
        return (List<String>) cacheObject.getValue();
    }

    /**
     * 清理指定缓存【L1\L2】
     * @return
     */
    @GetMapping("/evict")
    public String evict(){
        cacheChannel.evict(region,key);
        return "evict success";
    }

    /**
     * 检测存在那级缓存
     * @return
     */
    @GetMapping("/check")
    public String check(){
        int check = cacheChannel.check(region, key);
        return "level:" + check;
    }

    /**
     * 检测缓存数据是否存在
     * @return
     */
    @GetMapping("/exists")
    public String exists(){
        boolean exists = cacheChannel.exists(region, key);
        return "exists:" + exists;
    }

    /**
     * 清理指定区域的缓存
     * @return
     */
    @GetMapping("/clear")
    public String clear(){
        cacheChannel.clear(region);
        return "clear success";
    }
}

第七步、测试(清理指定缓存【L1\L2】)

添加上面代码后,启动项目,访问:http://localhost:9000/user/evict
发现:Redis缓存中的数据被清理

相关文章:

  • dockerkubernets篇(二十七)
  • 操作系统--用JavaScript实现银行家算法
  • js严格模式
  • MySQL数据库——使用聚合函数查询
  • Java Excel 合并单元格 Java Excel 实现尾部添加数据 Java Excel 合并单元格 添加数据 poi excel 合并单元格
  • SSM仓库管理系统毕业设计-附源码061015
  • 猿创征文|Docker【配置好的镜像】 迁移到【新服务器】上 不需要重新配置环境参数·爽
  • 关于现代化应用和云原生应用
  • R语言矩阵运算:矩阵转置、计算逆矩阵、两个矩阵的相乘、构建nxn对角(单位)矩阵
  • 数据结构————堆
  • 【GNN报告】Mila实验室/蒙特利尔大学朱兆成:基于图神经网络的知识图谱推理
  • ssm大型商场移动导游系统的设计与实现毕业设计源码100853
  • springboot日结工管理小程序毕业设计-附源码070940
  • R语言生成字符串的所有成对组合:使用outer函数和paste函数生成所有字符串的成对组合(笛卡尔积)、自定义指定组合字符串的分隔符
  • 详解模板引擎二
  • [译]Python中的类属性与实例属性的区别
  • Cookie 在前端中的实践
  • CSS 专业技巧
  • Docker入门(二) - Dockerfile
  • ES6语法详解(一)
  • IOS评论框不贴底(ios12新bug)
  • Mac转Windows的拯救指南
  • MySQL几个简单SQL的优化
  • React-生命周期杂记
  • Spring声明式事务管理之一:五大属性分析
  • Terraform入门 - 1. 安装Terraform
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 闭包--闭包之tab栏切换(四)
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 少走弯路,给Java 1~5 年程序员的建议
  • 网络应用优化——时延与带宽
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 用mpvue开发微信小程序
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​flutter 代码混淆
  • ​水经微图Web1.5.0版即将上线
  • # Panda3d 碰撞检测系统介绍
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (02)vite环境变量配置
  • (03)光刻——半导体电路的绘制
  • (多级缓存)缓存同步
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (转)c++ std::pair 与 std::make
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .a文件和.so文件
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Core 中间件验签
  • .net Stream篇(六)
  • @EnableWebMvc介绍和使用详细demo
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [asp.net core]project.json(2)