【SpringBoot应用篇】SpringBoot集成j2cache二级缓存框架

news2024/11/14 2:40:28

【SpringBoot应用篇】SpringBoot集成j2cache二级缓存框架

  • j2cache介绍
  • j2cache入门使用
    • pom
    • application.yml
    • caffeine.properties
    • CacheTestController
    • 启动类

j2cache介绍

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

j2cache的两级缓存结构:

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

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

J2Cache 的使用场景: 由于大量的缓存读取会导致L2的网络成为整个系统的瓶颈,因此L1的目标是降低对L2的读取次数。该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的ehcache缓存数据丢失。

J2Cache 默认使用 Caffeine 作为一级缓存,使用 Redis 作为二级缓存。

数据读取顺序 -> L1 -> L2 -> DB

j2cache入门使用

pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.9.RELEASE</version>
</parent>

<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>

application.yml

server:
  port: 9000

redis:
  ip: 127.0.0.1
  port: 6379
  password:
  database: 0

spring:
  cache:
    type: GENERIC
  redis:
    host: ${redis.ip}
    password: ${redis.password}
    port: ${redis.port}
    database: ${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: ${redis.ip}:${redis.port}
  password: ${redis.password}
  database: ${redis.database}
  sentinelMasterId:
  maxTotal: 100
  maxIdle: 10
  minIdle: 10
  timeout: 10000

caffeine.properties

caffeine配置: region不存在caffeine.properties配置文件中,使用default区域

  • hb(region区域)=100(key数量), 30s(过期时间)
#########################################
# Caffeine configuration
# [name] = size, xxxx[s|m|h|d]
#########################################
default=2000, 2h
hn=50, 2h
hb=100, 30s

在这里插入图片描述

CacheTestController

@RestController
@RequestMapping("/cache")
public class CacheTestController {
    private String key = "myKey";
    private static final String HN_REGION = "hn";
    private static final String HB_REGION = "hb";

    @Autowired
    private CacheChannel cacheChannel;

    @GetMapping("/getUser")
    public List<String> getUser(String region){
        CacheObject cacheObject = cacheChannel.get(region, key);
        if(cacheObject.getValue() == null){
            //缓存中没有找到,查询数据库获得
            List<String> data = new ArrayList<String>();
            data.add("李白");
            data.add("韩信");
            //放入缓存
            cacheChannel.set(region,key,data);
            return data;
        }
        return (List<String>) cacheObject.getValue();
    }


    /**
     * 清理指定缓存
     */
    @GetMapping("/evict")
    public String evict(){
        cacheChannel.evict(HN_REGION,key);
        return "evict success";
    }

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

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

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

具体api:
在这里插入图片描述

启动类

@SpringBootApplication
public class J2CacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(J2CacheApplication.class,args);
    }
}

启动项目,访问地址:http://localhost:9000/cache/getUser?region=hb
在这里插入图片描述
重启项目,由于j2cache的一级缓存(caffeine)是进程级缓存,重启后一级缓存消失。但是二级缓存(redis)的数据还存在,再次访问上面地址,通过debug断点调试可以看到程序从redis中获取了缓存数据。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《悠悠岁月》悠悠岁月,浅藏浅忆,且行且珍惜

《悠悠岁月》悠悠岁月&#xff0c;浅藏浅忆&#xff0c;且行且珍惜 安妮埃尔诺&#xff0c;法国当代著名女作家&#xff0c;2022年获诺贝尔文学奖。埃尔诺从1974年开始创作&#xff0c;至今已出版了约十五部作品。《悠悠岁月》这部历经二十余年思考和推敲的杰作&#xff0c;使她…

Apache Shiro(一)

1.Apache Shiro Apache Shiro Reference Documentation | Apache Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完 成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松 地保护任何应用程序——从最…

PHPExcel基本使用(2) 导入图片

一、效果二、代码一、效果 基于这篇 PHPExcel基本使用&#xff08;2&#xff09; 导入图片 调整 二、代码 基于thinkphp5.1 <?phpnamespace app\index\controller;use think\facade\Env;class Test {public function test(){self::excelAction();}/*** todo 导出报表*…

Microcontent - 微内容

这两年&#xff0c;微内容不断被人提及。微内容是什么&#xff1f;微内容解决什么问题&#xff1f;今天我们一起来看看这个话题。 作者&#xff1a;Sarah Cuellar - 1 - 什么是微内容 什么是微内容&#xff1f;微内容指的是小块的内容&#xff0c;它们遵循具体的的结构规则…

classnames 源码学习笔记与解读

前言 这里我引用源码文档中的一句话来作为开场白&#xff1a; A simple JavaScript utility for conditionally joining classNames together. 话不多说&#xff0c;咱们直接开始 classnames 的源码学习。 核心源码解读 直接来看它的源码部分&#xff0c;以下这是 classnam…

Win10的几个实用技巧系列之win10和win8系统哪个好用、系统任务栏和窗口假死的解决方法

目录 win10系统任务栏和窗口假死怎么办?win10系统任务栏和窗口假死的解决方法 win10系统任务栏和窗口假死怎么解决 Win10进不去Epic下载的死亡搁浅怎么办?Win10玩死亡搁浅闪退的解决方法 Epic领取的死亡搁浅进不去 Win10玩死亡搁浅闪退的解决方法 win10和win8系统哪个好用…

Eth09- EthCtrlConfig:以太网控制器写MAC地址到NVM中的配置

文章目录 1 MAC地址保存到非易失性存储器中传送门 ==>> AutoSAR入门和实战系列总目录 1 MAC地址保存到非易失性存储器中 如果想把MAC地址保存到非易失性存储器中,防止掉电之后MAC地址不存在了,可以通过以下的配置参数,实现实时保存MAC地址到NVM中 EthCtrlConfig/…

【Effective Objective - C】—— 读书笔记(四)

【Effective Objective - C】—— 读书笔记&#xff08;四&#xff09; 协议与分类 文章目录【Effective Objective - C】—— 读书笔记&#xff08;四&#xff09;协议与分类23.通过委托与数据源协议进行对象间通信要点&#xff1a;24.将类的实现代码分散到便于管理的数个分类…

Friedman 检验后的two-tailed Nemenyi test和the two-tailed Bonferroni-Dunn test的关键值

Critical values qαq_{\alpha}qα​ for post-hoc tests after the Friedman testCritical values qαq_{\alpha}qα​ for the two-tailed Nemenyi test Critical values qαq_{\alpha}qα​ for the two-tailed Bonferroni-Dunn test 其中classifiers是比较的方法个数&#…

【nowcoder】笔试强训Day15

目录 一、选择题 二、编程题 2.1 查找输入整数二进制中1的个数 2.2 手套 一、选择题 1.给出数据表 score(stu-id,name,math,english,Chinese), 下列语句正确的是&#xff08; &#xff09; A. Select sum(math),avg(chinese) from score B. Select *,sum(english) from …

初步改造2

1.找到登录按钮的触发方法 views/login/index.vue 找到是handleLogin 接着发现调用的是vuex里面的user/login方法 2.vuex中的方法&#xff0c;其实对应于"store/modules/user.js 中actions的login方法 3.前端请求与发现无响应&#xff0c;我们先用postman排除是后端问题&a…

Java集合 - HashMap

介绍 HashMap Map 是一种存储键值对的集合。Map 集合可以根据 key 快速查找对应的 value 值。HashMap 是 Map 类型的一中。 HashMap 的底层存储结构是&#xff1a;数组 链表 红黑树。 下面我们通过 HashMap 的新增操作、查找操作来看 HashMap 的底层存储结构。 HashMap 的…

深入理解ConcurrentHashMap1.8源码

1. 概述 之前介绍了ConcurrentHashMap1.7&#xff0c;采用的是数组分段锁的方式来实现的。虽然说采用分段锁的方式能够在一定程度上提高并发的效率&#xff0c;但是锁的粒度是Segment级别的&#xff0c;其实还是挺大的。 于是&#xff0c;ConcurrentHashMap1.8继续在1.7版本上…

postgresql_internals-14 学习笔记(五)Buffer Cache

新年的第一篇博客~ 一、 Buffer Cache简介 1. 主要用途 调和内存&#xff08;ns级&#xff09;与磁盘&#xff08;ms级&#xff09;间的速度差异。 pg不仅用自己的buffer cache&#xff0c;也用os cache&#xff0c;所以它使用了“双缓存”&#xff0c;这也是很多文档推荐sha…

《UEFI内核导读》UEFI是不是操作系统?

敬请关注微信公众号&#xff1a;“固件C字营” 最近一直在思考一个问题&#xff0c;UEFI是什么&#xff1f;UEFI算不算是操作系统&#xff1f; 众所周知&#xff0c;计算机系统是由软件和硬件两大部分组成的&#xff0c;但从更科学的角度来划分&#xff0c;我们其实可以分得更…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(四级)答案解析

目录 一、单选题&#xff08;共15题&#xff0c;每题2分&#xff0c;共30分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共5题&#xff0c;共50分&#xff09; 青少年软件…

【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?

文章目录前言哪些场景会造成行锁升表锁&#xff1f;如何避免?如何分析排查?查看InnoDB_row_lock%相关变量查看 INFORMATION_SCHEMA系统库总结最后前言 在上文我们曾小小的提到过&#xff0c;在索引失效的情况下&#xff0c;MySQL会把所有聚集索引记录和间隙都锁上&#xff0…

【正点原子】嵌入式Linux C应用编程-第十一章

第十一章&#xff1a;线程 前言&#xff1a; 与进程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制&#xff0c;线程参与系统调度&#xff0c;事实上&#xff0c;系统调度的最小单元为线程&#xff0c;而不是进程 1&#xff1a;线程的概念 什么是线程&#xff…

【游戏编程扯淡精粹】自研引擎切 UE

【游戏编程扯淡精粹】自研引擎切 UE UF2022 的两篇讲座&#xff0c;再加上 The Machinery 引擎项目失败 结合过去两年笔者使用自研引擎的体验&#xff0c;其实有一部分是共通的 Crystal Dynamics&#xff1a;如何从自研引擎转变到虚幻引擎5 游戏技术&#xff08;featurelist…

LVGL的学习及使用

1、LVGL简介 LVGL是最受欢迎的免费开源嵌入式图形库&#xff0c;可为任何MCU、MPU和显示器类型创建漂亮的用户界面。使用SquareLine工作室&#xff0c;使用拖放UI编辑器来简化开发。 1.1、LVGL源码下载 lvgl 在github 上的开源代码 https://github.com/lvgl/lvgl 下载的源码包里…