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

文章目录

  • 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、caffeinekeyConvertor: jacksonremote:default:type: redis.lettuce    # 缓存类型:远程缓存支持tair、rediskeyConvertor: jackson  # key转换器的全局配置broadcastChannel: 'jetCache'keyPrefix: 'jetCache'valueEncoder: java    # 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryovalueDecoder: java    # 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryodefaultExpireInMillis: 60000poolConfig:minIdle: 5maxIdle: 20maxTotal: 50uri: 'redis://${JETCACHE_PASSWD:}@${JETCACHE_HOST:}:${JETCACHE_PORT:}/?database=${JETCACHE_DATABASE:4}'

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


@Configuration
public class JetCacheConfig {/*** 缓存管理器.*/@Resourceprivate CacheManager cacheManager;/*** 消息模版ID缓存.*/private Cache<String, String> msgTemplateCache;/*** 初始化缓存.*/@PostConstructpublic void init() {// 1、一级缓存:仅使用本地缓存,切永不失效
//        msgTemplateCache = cacheManager.getOrCreateCache(QuickConfig.newBuilder("cache-")
//                .cacheType(CacheType.LOCAL)
//                .build());// 2、二级缓存: 使用本地缓存+redisDuration 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);}@Beanpublic Cache<String, String> getMsgTemplateCache() {return msgTemplateCache;}
}@Slf4j
@Component
public class ProjectInitDataTask implements ApplicationRunner {/*** 消息模版缓存.*/@Autowiredprivate Cache<String, String> msgTemplateCache;@Overridepublic 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.xdnf.cn/news/1540453.html

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

相关文章

Redis基本命令详解

1. 基本命令 命令不区分大小写&#xff0c;而key是区分大小写的 # select 数据库间的切换 数据库共计16个 127.0.0.1:6379> select 1# dbsize 返回当前数据库的 key 的数量 127.0.0.1:6379[1]> dbsize# keys * 查看数据库所有的key 127.0.0.1:6379[1]> keys *# fl…

SpringBoot+Vue+MySQL驾校预约管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着社会的进步&#xff0c;各行各业都在充分利用信息化时代的优势。由于计算机技术的广泛应用和普及&#xff0c;各种信息系统…

极越联手百度这你受得了吗!SU7还能稳坐“7字辈”头把交椅?

文/王俣祺 导语&#xff1a;自从今年上半年小米SU7标榜为“年轻人的第一台纯电轿车”&#xff0c;各家车企全都坐不住了。尤其是与小米“颇有渊源”的吉利&#xff0c;从极氪再到领克&#xff0c;目标已经可以说是路人皆知了。现在极越07也来了&#xff0c;可以看出吉利也是下了…

在Windows环境下设置SSH克隆GitHub仓库

在Windows环境下设置SSH克隆GitHub仓库的步骤如下&#xff1a; 1. 生成SSH密钥 打开 Git Bash&#xff08;如果你已经安装了Git&#xff09;。输入以下命令生成SSH密钥&#xff1a;ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 按 Enter 键接受默认文件名…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】下

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

d3dcompiler47dll丢失怎么解决,详细介绍6种解决方案

在电脑使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是系统提示某个文件缺失。其中&#xff0c;d3dcompiler_47.dll是许多用户经常遇到的问题之一。这个文件是DirectX组件的一部分&#xff0c;如果缺失&#xff0c;可能会导致游戏或应用程序无法正常运行…

Python学习——【3.1】函数

文章目录 【3.1】函数一、函数的定义二、函数的参数三、函数的返回值&#xff08;一&#xff09;函数返回值的定义&#xff08;二&#xff09;None类型 四、函数的说明文档五、函数的嵌套调用六、函数中变量的作用域&#xff08;一&#xff09;局部变量&#xff08;二&#xff…

软考「系统架构设计师」为什么很少报名?反倒是“系规”爆火?!

软考2024年下半年开考的科目有不少&#xff0c;其中有热门科目&#xff0c;也有冷门科目&#xff0c;比如系统架构设计师&#xff0c;感觉报名的人数不多。 此外&#xff0c;系统规划与管理师算是在今年下半年爆火了……那么&#xff0c;系统架构设计师为什么很少报名&#xff…

前端自动化测试框架:如何选择最适合你的方案

前端自动化测试是指使用代码或工具来模拟用户在浏览器上的操作&#xff0c;以检验网页或应用程序的功能和性能是否符合预期。前端自动化测试可以提高开发效率&#xff0c;减少人工错误&#xff0c;保证软件质量和用户体验。 但是&#xff0c;在众多的前端自动化测试框架中&…

09.20 C++对C的扩充以及C++中的封装、SeqList

SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include <iostream> #include<memory.h> #include<stdlib.h> #include<string.h>using namespace std;//typedef int datatype; //类型重命名 using datatype int;//封装一个顺序表 class Seq…

【实用教程】基于GIS和DEM的地形地貌特征提取与分析—以河北省为例(附详细步骤)

实验背景 河北省作为中国地形地貌最齐全的省份&#xff0c;其独特的地理位置和地质结构为基于GIS和DEM的地形地貌特征提取与分析提供了丰富的研究对象和实际应用场景。从西北向东南呈半环状逐级下降&#xff0c;包括高原、山地、丘陵、盆地、平原等类型&#xff0c;这种多样性…

【HTML5】html5开篇基础(1)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

python机器人编程——用手机web远程视频监控并控制小车驾驶(上篇vrep仿真)

目录 一、前言二、技术架构三、设备端实现四、服务控制端实现&#xff08;1&#xff09;摄像头服务模块&#xff08;2&#xff09;web服务器 五、web端实现&#xff08;1&#xff09;视频显示&#xff08;2&#xff09;驾驶盘的实现&#xff08;3&#xff09;心跳 六、总结七、…

情感类智能体——你的微信女神

智能体名称&#xff1a;你的微信女神 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/agent/preview/RulbsUjIGj4wsinydlBH7AR3NQKFungt 简介 “你的微信女神”是一个直率的智能体&#xff0c;她用犀利而真实的言辞帮助用户…

Jboss CVE-2015-7501 靶场攻略

漏洞介绍 这是经典的JBoss反序列化漏洞&#xff0c;JBoss在/invoker/JMXInvokerServlet请求中读取了⽤户传⼊的对象&#xff0c;然后我们利⽤Apache Commons Collections中的 Gadget 执⾏任意代码 影响范围 JBoss Enterprise Application Platform 6.4.4,5.2.0,4.3.0_CP10 …

交易量大幅下滑,被华尔街投行下调目标价,是时候卖出Coinbase股票了吗?

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;由于交易量出现了大幅下滑&#xff0c;华尔街投行杰富瑞已经将Coinbase的目标下调到了220美元&#xff0c; &#xff08;2&#xff09;尽管2024年第二季度订阅和服务业务增长强劲&#xff0c;但Coinbase的财务业绩还是未…

Jenkins自动化部署后端项目看这篇就够了

本文主要讲解&#xff0c;使用Jenkins自动化部署后端工程。讲解怎么自动化部署前后的分离项目中的后端工程。 前提条件&#xff1a;本地需要Jenkins&#xff0c;如果你不知道怎么安装&#xff0c;可以看我的另外一篇文章。 Jenkins实现自动部署的步骤&#xff1a; 先拉取git…

9.20作业

手动封装一个顺序表&#xff08;SeqList&#xff09;,分文件编译实现 有私有成员&#xff1a; 顺序表数组的起始地址 ptr、 顺序表的总长度&#xff1a;size、顺序表的实际长度&#xff1a;len 成员函数&#xff1a; 初始化 init(int n) 判空&#xff1a;empty 判满&#xff1…

计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Chat2VIS: Generating Data Visualizations via Natural Language

Chat2VIS:通过使用ChatGPT, Codex和GPT-3大型语言模型的自然语言生成数据可视化 梅西大学数学与计算科学学院&#xff0c;新西兰奥克兰 IEEE Access 1 Abstract 数据可视化领域一直致力于设计直接从自然语言文本生成可视化的解决方案。自然语言接口 (NLI) 的研究为这些技术的…