【开源组件】- 关于Jetcache的使用

关于Jetcache的使用

😄生命不息,写作不止
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🌝分享学习心得,欢迎指正,大家一起学习成长!

在这里插入图片描述

JetCache是由阿里巴巴开源的通用缓存访问框架,是个非常好用的一个开发工具。
GitHub地址:https://github.com/alibaba/jetcache

基本使用

本文简单介绍jetcache的使用,通过引入坐标,再到简单重要的注解的使用。

引入依赖

<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.7.3</version>
</dependency>

使用的2.7+的版本,需要额外添加该依赖

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version>
</dependency>

激活注解

需要在启动器类上加上两个注解,EnableMethodCache,EnableCreateCacheAnnotation这两个注解分别激活Cached和CreateCache注解。

@EnableMethodCache(basePackages = "org.nl")
@EnableCreateCacheAnnotation

配置

在application.yml中配置

jetcache:statIntervalMinutes: 15areaInCacheName: falselocal:default:type: linkedhashmapkeyConvertor: fastjsonremote:default:type: rediskeyConvertor: fastjson2broadcastChannel: projectAvalueEncoder: javavalueDecoder: javapoolConfig:minIdle: 5 # 连接池中的最小空闲连接数maxIdle: 20 # 连接池中的最大空闲连接数maxTotal: 50 # 连接池中的最大连接数host: 127.0.0.1port: 6379

jetcache.statIntervalMinutes:这个属性指定了Jetcache统计信息的刷新间隔,单位为分钟。Jetcache会定期收集并更新缓存的统计信息,以便监视缓存的性能和使用情况。
jetcache.areaInCacheName:这个属性用于确定是否将缓存区域(cache area)的名称包括在缓存名称中。
jetcache.local/remote:配置本地缓存,即在应用程序内存中的缓存。或者(配置远程缓存,通常是分布式缓存,如Redis。)
jetcache.local/remote.default.type:本地/远程缓存的类型。这里指定为 linkedhashmap,表示使用LinkedHashMap作为本地缓存的实现。
jetcache.local/remote.default.keyConvertor:用于将本地/远程的缓存键序列化和反序列化的键转换器。这里使用了fastjson,表示使用Fastjson库进行键的转换。
jetcache.remote.default.broadcastChannel:如果您的应用程序需要缓存广播功能,可以指定广播通道的名称。
jetcache.remote.default.valueEncoder:用于将缓存值序列化的值编码器。这里使用了java,表示使用Java序列化来编码缓存值。
jetcache.remote.default.valueDecoder:用于将缓存值反序列化的值解码器。
jetcache.remote.default.poolConfig:配置redis连接池参数

常用方法

@Cached注解

  • name:通过name来指定缓存的唯一名称,不是必须的,如果没有指定,会使用类名+方法名。name会被用于远程缓存的key前缀。可以自己定义,就只是个前缀。
  • key:使用SpEL指定key,如果没有指定会根据所有参数自动生成。会与name进行拼接,可以使用形参的内容来。
  • expire:过期时间

以下以项目中的系统参数来做demo
首先,不设置key,这样会默认将参数的数据作为key,会极大的不友好。

@Cached(name = "paramData.", expire = 3600, cacheType = CacheType.REMOTE)
Page<Param> queryPage(Map whereJson, PageQuery page);

因为参数是使用了Map来的,会导致redis的key很杂,后续没办法对其进行更新。
在这里插入图片描述

接下来设置一下key值,这里是可以使用SpEL表达式,可以直接输入数字,输入字符串需要加上''。否则会报错,如果使用字符串而没有加上''就会被默认是使用参数字段。

@Cached(name = "paramData.", key = "open", expire = 3600, cacheType = CacheType.REMOTE)
Page<Param> queryPage(Map whereJson, PageQuery page);

以上是没有''来区分字符串,代码中就会出现SpelEvaluationException错误
在这里插入图片描述

加上''

@Cached(name = "paramData.", key = "'open'", expire = 3600, cacheType = CacheType.REMOTE)
Page<Param> queryPage(Map whereJson, PageQuery page);

也可以是使用参数,需要注意的是,修改的时候需要去触发修改或者失效。

@CacheUpdate
@CacheInvalidate

@Cached(name = "paramDataCode.", key = "#code", expire = 3600, cacheType = CacheType.REMOTE)
Param findByCode(String code);

加上之后可以在redis中查看,key值就比较清晰易懂。
在这里插入图片描述

也可以使字符串+参数的拼接

@Cached(name = "paramData.", key = "'open' + #page.size + #page.page", expire = 3600, cacheType = CacheType.REMOTE)
IPage<Param> queryPage(Map whereJson, PageQuery page);

那么,如果只是这样创建的话,当数据更新之后,只要没达到过期时间,数据也还是会是旧数据。
jetcache提供了更新的注解,当每次调用了更新方法,就会让对应的缓存数据失效。

@CacheInvalidate(name = "paramData.", key = "'open'")
void update(Param param);

:::info
使用@CacheUpdate和@CacheInvalidate的时候,相关的缓存操作可能会失败(比如网络IO错误),所以指定缓存的超时时间是非常重要的。
:::

@CacheUpdate注解

更新数据注解,当运行该注解下的方法,就会更新所对应的值,如果没有更新,只能等待自动过期。常用参数有:name, key, value,name和key是拼接起来对应在redis的key,value是对应的值,也是需要替换的值。
如以下官方文档

public interface UserService {@Cached(name="userCache-", key="#userId", expire = 3600)User getUserById(long userId);@CacheUpdate(name="userCache-", key="#user.userId", value="#user")void updateUser(User user);@CacheInvalidate(name="userCache-", key="#userId")void deleteUser(long userId);
}

当userCache-1的值改动了,就会将新的数据覆盖。
如以下例子,通过code获取参数表中的数据,并缓存起来。

@Cached(name = "paramDataCode.", key = "#code", expire = 3600, cacheType = CacheType.REMOTE)
Param findByCode(String code);

当对其进行更新数据时候,需要把这个缓存中的数据也更新。

@CacheInvalidate(name = "paramData.", key = "'open'")
@CacheUpdate(name = "paramDataCode.", key = "#param.code", value = "#param")
void update(Param param);

@CacheInvalidate注解

@CacheInvalidate是用来使缓存失效的注解,通过name,key来确定失效的缓存。
*分页查询不适合用缓存

@Cached(name = "paramData.", key = "'open'", expire = 3600, cacheType = CacheType.REMOTE)
Page<Param> queryPage(Map whereJson, PageQuery page);@CacheInvalidate(name = "paramData.", key = "'open'")
void create(Param param);

@CacheRefresh注解

用于配置缓存刷新策略。它可以标注在方法上,表示当缓存失效时,将会触发指定的方法来重新加载缓存数据。

@CacheRefresh(name = "myCache", timeUnit = TimeUnit.MINUTES, refresh = 10)
public void refreshCache(String key);

name = “myCache” 指定了要刷新的缓存名称。
timeUnit = TimeUnit.MINUTES 指定了时间单位为分钟。
refresh = 10 指定了刷新的时间间隔为10分钟。

*注:
方法的返回类型必须是 void。
方法的参数可以是缓存键或与缓存键相关的信息,用于定位需要刷新的缓存项。
方法的参数列表必须与缓存方法(被 @Cached 注解的方法)的参数列表相匹配。

@CachePenetrationProtect注解

用于防止缓存击穿,通过在多个并发请求中只有一个请求去加载数据,其他请求等待加载完成后直接从缓存获取。

@CachePenetrationProtect
@Cached(name = "paramData.", key = "'open' + #page.size + #page.page", expire = 3600, cacheType = CacheType.REMOTE)
@CacheRefresh(refresh = 3, stopRefreshAfterLastAccess = 60*60, refreshLockTimeout = 0)
IPage<Param> queryPage(Map whereJson, PageQuery page);

CacheManager

使用CacheManager可以创建Cache实例,area和name相同的情况下,它和Cached注解使用同一个Cache实例。

注意:在jetcache 2.7 版本CreateCache注解已经废弃,请改用CacheManager.getOrCreateCache(QuickConfig)

使用demo

@Autowired
private CacheManager cacheManager;
private Cache<String, Param> userCache;@PostConstruct
public void init() {QuickConfig qc = QuickConfig.newBuilder("userCache").expire(Duration.ofSeconds(100)).cacheType(CacheType.REMOTE) // two level cache.syncLocal(true) // invalidate local cache in all jvm process after update.build();userCache = cacheManager.getOrCreateCache(qc);
}// 方法内使用
userCache.put("name", param); // 写缓存
System.out.println(userCache.get("name")); // 读缓存

CreateCache注解

可以直接创建缓存实例

@CreateCache(expire = 100)
private Cache<Long, UserDO> userCache;

对应属性表
image.png

总结

本篇记录了笔者在开发中会使用到的注解/方法,对于其字段含义也做了一定的备注。

👍创作不易,如有错误请指正,感谢观看!记得点赞哦!👍

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

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

相关文章

K8s 中 Pod OOMKilled 原因

目录 Exit Code 137 解决方案 JVM 感知 cgroup 限制 使用 JDK9 的容器感知机制尝试 问题分析 容器内部感知 CGroup 资源限制 在 Java10 中&#xff0c;改进了容器集成 JVM 参数 MaxDirectMemorySize -XX:MaxDirectMemorySize 的默认值是什么&#xff1f; 其他获取 ma…

电源控制系统架构(PCSA)之电源管理基础设施组件

目录 6.5 电源管理基础设施组件 6.5.1 电源策略单元 6.5.2 时钟控制器 6.5.3 低功耗Distributor 6.5.4 低功耗Combiner 6.5.5 P-Channel到Q-Channel转换器 6.5 电源管理基础设施组件 6.5.1 电源策略单元 本节介绍电源策略单元(Power Policy Unit, PPU)。PPU的完整细节见…

Java核心知识点整理大全14-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

CSS特效019:图标图片悬浮旋转一周

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

【数据结构实验】查找(二)基于线性探测法的散列表

文章目录 1. 引言2. 实验原理2.1 散列表2.2 线性探测法 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现三、实验设计3.3 代码整合 4. 实验结果 1. 引言 本实验将通过C语言实现基于线性探测法的散列表 2. 实验原理…

R语言期末复习一

创建一个长度为7的字符向量&#xff0c;元素为"A", "B", "C", "D", "E", "F", "G"&#xff0c;并命名为vec1。 创建一个因子&#xff0c;包含6个水果&#xff1a;"apple", "banana"…

Kubernetes 秘密暴露使大型区块链公司面临风险

领先的网络安全专家对公开的 Kubernetes 配置表示担忧&#xff0c;这可能会威胁许多组织供应链的安全。 受影响的公司包括两家主要的区块链公司&#xff08;出于安全原因&#xff0c;其名称已被隐去&#xff09;以及其他多家财富 500 强公司。 Aqua Security 研究人员报告称&…

NX二次开发UF_CURVE_ask_joined_parms 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_joined_parms Defined in: uf_curve.h int UF_CURVE_ask_joined_parms(tag_t joined_curve_feature, UF_STRING_p_t uf_curve_string, int * creation_method, double …

物联网后端个人第十二周总结

学习工作进度 物联网方面 1.模拟设备通过规则引擎将数据通过mqtt进行转发 在物联网平台上实现模拟设备通过规则引擎将数据通过mqtt进行转发已经全部完成了&#xff0c;所使用的物联网平台在这方面有不少的问题和bug&#xff0c;也可能是没有按照开发者的想法对平台进行使用才导…

MATLAB在信号系统中的应用

1.产生一个幅度为1, 基频为2Hz&#xff0c;占空比为50%的周期方波.要求画出图形。 在MATLAB中&#xff0c;函数square(w0*t, DUTY)产生基本频率为w0 (周期T2*pi/w0)、占空比DUTY (τ/T)*100的周期矩形波&#xff08;方波&#xff09;&#xff0c;默认情况下占空比DUTY50。占空…

如何理解2023vivo开发者大会,使用Rust语言编写蓝河操作系统(BlueOS)?

在2023年vivo开发者大会上&#xff0c;vivo宣布使用Rust语言编写其蓝河操作系统&#xff08;BlueOS&#xff09;。 什么是Rust语言&#xff1f; Rust 是一种开放源代码系统编程语言&#xff0c;可用于开发高效、安全的软件。 使用 Rust 可管理内存并控制其低级详细信息。 但你…

LLM之Agent(一):使用GPT-4开启AutoGPT Agent自动化任务完整指南

在ChatGPT引领的大模型时代&#xff0c;要想让大模型按照用户的指令执行&#xff0c;Prompt设计是一门艺术&#xff0c;由此还催生了一个职业”Prompt工程师“。其实&#xff0c;并不是所有人都可以设计出好的Prompt&#xff0c;甚至同样的Prompt应用在不同的大模型上表现的结果…

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训 在当今数字化时代&#xff0c;大数据技术的迅猛发展带来了前所未有的数据增长&#xff0c;同时也催生了对数据安全和网络安全的更为迫切的需求。本篇博客将聚焦于大数据技术背景下的数据安全与网络安全&#xff…

扫描条形码到电脑:Barcode to pc 4.6.3 Crack

像专业人士一样使用条形码将条形码发送到 PC 排名第一的智能手机扫描应用程序 将条形码即时发送到计算机程序并自动执行任务的最简单方法 受到全球 500,000 多名用户的信赖 条形码到 PC&#xff1a;Wi-Fi 扫描仪应用程序&#xff0c;条码到 PC&#xff1a;适用于 Android 和 i…

MidJourney笔记(3)-Prompts

MidJourney的Prompts介绍 MidJourney的Prompts是MidJourney的核心之一,这也是我们后续使用MidJourney过程中最重要的工作内容,根据生成的图片,不断的优化我们的Prompts内容。 那Prompts的中文意思是提示的意思。 Prompts的提示语有很多,最基础的用法就是: /imagine prompt…

【Web】[GKCTF 2021]easycms

直接点击登录按钮没有反应 扫目录扫出来/admin.php 访问 弱口令admin 12345直接登录成功 点开设计--主题--自定义 编辑页头&#xff0c;类型选择php源代码 点保存显示权限不够 设计--组件--素材库 先随便上传一个文件&#xff0c;之后改文件名称为../../../../../system/tmp…

JsonRPC协议详解(协议介绍、请求示例、响应示例)

JsonRPC协议详解 什么是RPC&#xff1f; RPC&#xff08;远程过程调用&#xff09;是一种用于实现分布式系统中不同进程或不同计算机之间通信的技术。它允许我们像调用本地函数一样调用远程计算机上的函数&#xff0c;使得分布式系统的开发变得更加简单和高效。 什么是JsonRP…

Deepin使用记录-deepin系统下安装RabbitMq

目录 0、引言 1、由于RabbitMq是erlang语言开发的&#xff0c;所有需要先安装erlang 2、更新源并安装RabbitMq 3、安装完成之后&#xff0c;服务是启动的&#xff0c;可以通过以下语句查看状态 4、这样安装完成之后&#xff0c;是看不到web页面的&#xff0c;需要再安装一…

MySQL数据库——存储函数(介绍、案例)

目录 介绍 案例 介绍 存储函数是有返回值的存储过程&#xff0c;存储函数的参数只能是IN类型的。具体语法如下&#xff1a; CREATE FUNCTION 存储函数名称 ([ 参数列表 ]) RETURNS type [characteristic ...] BEGIN-- SQL语句RETURN ...;END ; characteristic说明&#xf…

[修订版][工控]SIEMENS S7-200 控制交通红绿灯程序编写与分析

下载地址>https://github.com/MartinxMax/Siemens_S7-200_Traffic_Light 特别鸣谢接线过程实验目的题目要求I/O分配公式公式套用示例 程序分析分割块[不是必要的,自己分析用]左侧梯形图 [B1-B5]B1 [东西绿灯亮25s]B2 B3 B23 [东西绿灯闪烁3s]B4 [东西黄灯亮2s]B5 [东西红灯…