jetcache-阿里多级缓存框架神器一定要掌握

news2024/9/20 21:08:31

文章目录

  • 1. 简介
  • 2. springboot集成jetcache
    • 2.1 引入依赖
    • 2.2 配置文件
    • 2.3 高级API模式:通过CacheManager使用缓存,2.7 版本才可使用
    • 2.4 (推荐)AOP模式:通过@Cached,@CacheUpdate,@CacheInvalidate注解

1. 简介

JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。 当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。
JetCache需要JDK1.8、Spring Framework4.0.8以上版本。Spring Boot为可选,需要1.1.9以上版本。如果不使用注解(仅使用jetcache-core),Spring Framework也是可选的,此时使用方式与Guava/Caffeine cache类似。

全部特性:
	通过统一的API访问Cache系统
	通过注解实现声明式的方法缓存,支持TTL和两级缓存
	通过注解创建并配置Cache实例
	针对所有Cache实例和方法缓存的自动统计
	Key的生成策略和Value的序列化策略是可以配置的
	分布式缓存自动刷新,分布式锁 (2.2+)
	异步Cache API (2.2+,使用Redis的lettuce客户端时)
	Spring Boot支持

2. springboot集成jetcache

务必根据配置文件引入相关依赖,否则会有各种报错,本文以caffeine、redis.lettuce缓存为例
在这里插入图片描述

2.1 引入依赖

        <dependency>
            <groupId>com.alicp.jetcache</groupId>
            <artifactId>jetcache-starter-redis-lettuce</artifactId>
            <version>${jetcache.version}</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

2.2 配置文件

jetcache:
  statIntervalMinutes: ${CACHE_STATS_INTERNAL:1}  # 统计间隔,0表示不统计
  areaInCacheName: true                           # jetcache-anno把cacheName作为远程缓存key前缀,为了保持远程key兼容默认值为true,但是新项目的话false更合理些。
  enabled: ${JETCACHE_ENABLED:true}
  local:
    default:
      type: caffeine                               # 缓存类型,本地缓存类型支持linkedhashmap、caffeine
      keyConvertor: jackson
  remote:
    default:
      type: redis.lettuce    # 缓存类型:远程缓存支持tair、redis
      keyConvertor: jackson  # key转换器的全局配置
      broadcastChannel: 'jetCache'
      keyPrefix: 'jetCache'
      valueEncoder: java    # 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo
      valueDecoder: java    # 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo
      defaultExpireInMillis: 60000
      poolConfig:
        minIdle: 5
        maxIdle: 20
        maxTotal: 50
      uri: 'redis://${JETCACHE_PASSWD:}@${JETCACHE_HOST:}:${JETCACHE_PORT:}/?database=${JETCACHE_DATABASE:4}'

2.3 高级API模式:通过CacheManager使用缓存,2.7 版本才可使用


@Configuration
public class JetCacheConfig {
    /**
     * 缓存管理器.
     */
    @Resource
    private CacheManager cacheManager;
    
    /**
     * 消息模版ID缓存.
     */
    private Cache<String, String> msgTemplateCache;
    
    /**
     * 初始化缓存.
     */
    @PostConstruct
    public void init() {
        // 1、一级缓存:仅使用本地缓存,切永不失效
//        msgTemplateCache = cacheManager.getOrCreateCache(QuickConfig.newBuilder("cache-")
//                .cacheType(CacheType.LOCAL)
//                .build());
        // 2、二级缓存: 使用本地缓存+redis
        Duration cacheDuration = Duration.ofSeconds(2 * 60);
        QuickConfig qc = QuickConfig.newBuilder("cache-")
                .cacheType(CacheType.BOTH)
                .syncLocal(true)
                .localLimit(1000)
                .localExpire(cacheDuration)
                .expire(cacheDuration)
                .build();
        msgTemplateCache = cacheManager.getOrCreateCache(qc);
    }
    
    @Bean
    public Cache<String, String> getMsgTemplateCache() {
        return msgTemplateCache;
    }
}

@Slf4j
@Component
public class ProjectInitDataTask implements ApplicationRunner {
    /**
     * 消息模版缓存.
     */
    @Autowired
    private Cache<String, String> msgTemplateCache;
    
    @Override
    public void run(ApplicationArguments args) {
        log.info("模拟创建缓存jetcache...");
        msgTemplateCache.put("msgTemplateCache1", "msgTemplateCache1");
        msgTemplateCache.put("msgTemplateCache2", "msgTemplateCache2");
        msgTemplateCache.put("msgTemplateCache3", "msgTemplateCache3");
        log.info("模拟创建缓存jetcache完成...");
    }
}

2.4 (推荐)AOP模式:通过@Cached,@CacheUpdate,@CacheInvalidate注解

  @GetMapping("getRemote")
    @Cached(name="userCache:", key = "#id", expire = 3600, timeUnit = TimeUnit.SECONDS, cacheType = CacheType.REMOTE)
    public User getRemote(Long id){
        User user = new User();
        user.setId(id);
        user.setName("用户remote"+id);
        user.setAge(23);
        user.setSex(1);
        System.out.println("第一次获取数据,未走缓存:"+id);
        return user;
    }
    
    @GetMapping("getLocal")
    @Cached(name="userCache:", key = "#id", expire = 3600, timeUnit = TimeUnit.SECONDS, cacheType = CacheType.LOCAL)
    public User getLocal(Long id){
        // 直接新建用户,模拟从数据库获取数据
        User user = new User();
        user.setId(id);
        user.setName("用户local"+id);
        user.setAge(23);
        user.setSex(1);
        System.out.println("第一次获取数据,未走缓存:"+id);
        return user;
    }
    
    @GetMapping("getBoth")
    @Cached(name="userCache:", key = "#id", expire = 3600, timeUnit = TimeUnit.SECONDS, cacheType = CacheType.BOTH)
    public User getBoth(Long id){
        // 直接新建用户,模拟从数据库获取数据
        User user = new User();
        user.setId(id);
        user.setName("用户both"+id);
        user.setAge(23);
        user.setSex(1);
        System.out.println("第一次获取数据,未走缓存:"+id);
        return user;
    }
    
    @PostMapping("updateUser")
    @CacheUpdate(name = "userCache:", key = "#user.id", value = "#user")
    public Boolean updateUser(@RequestBody User user){
        // TODO 更新数据库
        return true;
    }

    @PostMapping("deleteUser")
    @CacheInvalidate(name = "userCache:", key = "#id")
    public Boolean deleteUser(Long id){
        // TODO 从数据库删除
        return true;
    }

在这里插入图片描述

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

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

相关文章

局部整体(六)利用python绘制树状图

局部整体&#xff08;六&#xff09;利用python绘制树状图 树状图&#xff08; Dendrogram&#xff09;简介 由一个根节点组成&#xff0c;根节点产生多个通过分支连接的子节点。常用于表示层次结构或显示聚类算法的结果。树状图既可以看明白数据的层次结构&#xff0c;也能明…

兴业小知识|法拍房你不知道的省钱小技巧~划走可就亏大了

如果说二手房市场是买卖双方之间的博弈&#xff0c;那法拍房市场则是纯买方的心理游戏。 在法拍房竞拍过程中&#xff0c;有人稳如泰山&#xff0c;有人坐立不安&#xff0c;每一次的出价都是对相互底线的一番试探。 有激进竞拍&#xff0c;拍出天价的&#xff0c;有一举夺魁…

2024.9.20营养小题【2】(动态分配二维数组)

这道题里边涉及到了动态分配二维数组的知识点&#xff0c;不刷这道题我也不知道这个知识点&#xff0c;算是一个比较进阶一点的知识点了。 参考&#xff1a;C语言程序设计_动态分配二维数组_哔哩哔哩_bilibili【C/C 数据结构 】二维数组结构解析 - 知乎 (zhihu.com)

网络爬虫Request静态页面数据获取

在现代 Web 开发中,HTTP 请求(Request)是与服务器进行通信的核心操作。无论是在前端还是后端开发中,数据的获取、传递以及处理都离不开请求的应用。特别是在静态页面的数据获取中,使用请求可以将页面变得更加动态和互动,从而大大提升用户体验,使得页面内容更加丰富和灵活…

电风扇制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

电风扇正悄然成为制造业数字化转型浪潮中的一颗璀璨新星。通过构建5G智能工厂物联数字孪生平台&#xff0c;电风扇制造业正以前所未有的速度和精度&#xff0c;推进着整个行业的智能化、网络化与个性化发展。5G技术的飞速发展&#xff0c;为制造业带来了前所未有的通信速度和低…

vue 入门一

参考&#xff1a;丁丁的哔哩哔哩 1.使用vue 1.1 使用CDN的方式使用Vue mount和<div id"counter">关联起来 1.2 vue中的createApp import { createApp } from "vue"; import App from "./App.vue"; createApp(App).mount("#app&qu…

【软件测试】如何设计测试用例? 设计测试用例常用的方法.

目录 一.什么是测试用例?二.总体设计测试用例的万能公式.2.1 功能性能界面兼容易用安全2.2 弱网测试2.3 安装卸载测试. 三. 常用设计具体测试用例的方法3.1 等价类3.2 边界值3.3 正交法3.3.1 正交表3.3.2 如何设计正交表,并根据正交表编写测试用例 3.4 判定表法3.4.1 根据判定…

红日药业携手实在智能,构建RPA数字员工平台满足业务一体化需求 | 实在RPA案例

近日&#xff0c;天津红日药业股份有限公司&#xff08;简称“红日药业”&#xff09;与实在智能达成合作&#xff0c;依托实在智能业内领先的AIRPA技术&#xff0c;红日药业着手构建企业数字员工平台&#xff0c;满足业务一体化需求&#xff0c;培育新质生产力&#xff0c;为企…

基于PHP的电脑线上销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的电脑线上销售系…

小程序服务零工市场

零工市场小程序有着信息发布、岗位匹配、线上接单、零工人员保障险参保、技能培训、费用结算、完工确认、服务评价、纠纷调解等功能&#xff0c;为求职者和雇主搭建一座高效、便捷、精准的对接桥梁。 用工单位通过小程序的“雇主找人”&#xff0c;发布招聘信息&#xff0c;找到…

react-native连接android原生模块

目录 搭建react-native项目 搭建node和jdk的环境 搭建Android的环境 创建React-native项目 运行react-native项目 下载夜神模拟器 使用adb连接夜神浏览器。 运行react-native项目 编写原生安卓的apk android studio中编写原生代码 在React-native编写代码。 搭建rea…

【干货分享】2024软件测试面试题汇总

前言 本篇分享的软件测试面试题内容主要包括&#xff1a;测试总体、需求分析、测试计划、测试策略、测试用例、缺陷报告、测试总结报告、白盒测试、单元测试、集成测试、系统测试、验收测试等等26个模块。 1. 什么是软件测试&#xff1f; 答&#xff1a;为了发现程序中的错误…

滚动条指定距离滚动

/*** scroller 滚动条元素* to 滚动到位置* duration 滚动时间*/ function scrollLeftTo (scroller, to, duration) {let rafIdlet count 0const from scroller.scrollLeftconst frames duration 0 ? 1 : Math.round((duration * 1000) / 16)function cancel () {cancelAn…

学习CubeIDE——定时器开发

在b站上学习洋桃电子关于HAL库开发&#xff0c;发现使用CubeIDE是真的简单又方便。 实验现象&#xff1a;使用定时器来产生中断&#xff0c;中断程序是LED灯翻转 在我看来&#xff0c;定时器&#xff0c;是一个从0开始增1&#xff08;常规&#xff09;&#xff0c;增加到一定…

存量新篇,商机无限,2024中国重庆建博会将于下月开展

在步入存量房时代的全新篇章中&#xff0c;中国家居建材行业正孕育着前所未有的转型机遇与商业蓝海。重庆作为西南地区的璀璨明珠与战略要地&#xff0c;以前所未有的决心与力度&#xff0c;推进实施了旧改局改与以旧换新等一系列创新政策。 《关于加快推进中心城区旧城改造工…

心觉:小时候常听到的这些教导,正在禁锢你的人生,该翻身了

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作175/1000天 小时候&#xff0c;我们常常被父母或老师教导&#xff1a; 不要去打扰别人 不要影响别人 不要出头 人多要往后站 …

【免费下载】信通院的DCMM标准解读

荐言&#xff1a;深入解读信通院DCMM标准&#xff0c;引领数据管理新高度在数字化转型的浪潮中&#xff0c;数据管理已成为企业核心竞争力的重要组成部分。中国信息通信研究院&#xff08;信通院&#xff09;发布的《数据管理能力成熟度评估模型》&#xff08;DCMM&#xff09;…

OpenAi assistant run always fails when called from PHP

题意&#xff1a;从 PHP 调用时&#xff0c;OpenAI 助理运行总是失败。 问题背景&#xff1a; The runs I create with the openai-php library fail direct in 100% of cases. What am I doing wrong? I do not have much experience with php but this is the test script.…

屏幕翻译软件实时工具有哪些?剧粉朋友看这里

日常生活的忙碌之余&#xff0c;观看剧集成为放松心情的绝佳方式。 但当遇到非母语的影视作品时&#xff0c;语言差异可能会让人感到难以投入。 幸运的是&#xff0c;现在有了屏幕翻译软件&#xff0c;我们不再需要为听不懂外语而烦恼。 这些软件能够在你观看剧集时即时翻译…

MySQL索引知识个人笔记总结(持续整理)

本篇笔记是个人整理的索引知识总结&#xff0c;刚开始有点乱&#xff0c;后续会一直边学边整理边总结 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。就好比索引就是数据的目录 索引结构 Btree索引,Hash索引,Full-text索引&#xff0c;R-tree(空…