SpringBoot 整合 jetcache缓存
目前 jetcache 支持的本地缓存方案有两种,远程缓存支持两种,分别如下:
- 本地缓存(Local)
- LinkedHashMap
- Caffeine
- 远程缓存(Remote)
-
Redis
-
Tair
-
依赖导入
<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.6.2</version>
</dependency>
配置
远程方案基本配置,当前默认使用的远程方案是 redis
jetcache:statIntervalMinutes: 1local:default:type: linkedhashmapkeyConvertor: fastjsonremote:default:type: redishost: localhostport: 6379keyConvertor: fastjsonvalueEncode: javavalueDecode: javapoolConfig:maxTotal: 50localdemo: # 自定义本地文件夹内(area)type: redishost: localhostport: 6379keyConvertor: fastjsonvalueEncode: javavalueDecode: javapoolConfig:maxTotal: 50remotedemo: # 自定义远程文件夹内(area)type: redishost: localhostport: 6379keyConvertor: fastjsonvalueEncode: javavalueDecode: javapoolConfig:maxTotal: 50
其中 poolConfig 是必配项,否则会报错
步骤③:启用缓存,在引导类上方标注注解 @EnableCreateCacheAnnotation 配置 springboot 程序中可以使用注解的形式创建缓存
@EnableCreateCacheAnnotation # 可以不要,属性缓存注解
@EnableMethodCache(basePackages = "com.example.demo")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
cacheType 控制当前缓存使用本地缓存还是远程缓存,配置 cacheType=CacheType.LOCAL 即使用本地缓存。
本地 + 远程方案
在创建缓存的时候,配置 cacheType 为 BOTH 即则本地缓存与远程缓存同时使用。
cacheType 如果不进行配置,默认值是 REMOTE,即仅使用远程缓存方案。关于 jetcache 的配置,参考以下信息
| 属性 | 默认值 | 说明 |
|---|---|---|
| jetcache.statIntervalMinutes | 0 | 统计间隔,0 表示不统计 |
| jetcache.hiddenPackages | 无 | 自动生成 name 时,隐藏指定的包名前缀 |
| jetcache.[local|remote].${area}.type | 无 | 缓存类型,本地支持 linkedhashmap、caffeine,远程支持 redis、tair |
| jetcache.[local|remote].${area}.keyConvertor | 无 | key 转换器,当前仅支持 fastjson |
| jetcache.[local|remote].${area}.valueEncoder | java | 仅 remote 类型的缓存需要指定,可选 java 和 kryo |
| jetcache.[local|remote].${area}.valueDecoder | java | 仅 remote 类型的缓存需要指定,可选 java 和 kryo |
| jetcache.[local|remote].${area}.limit | 100 | 仅 local 类型的缓存需要指定,缓存实例最大元素数 |
| jetcache.[local|remote].${area}.expireAfterWriteInMillis | 无穷大 | 默认过期时间,毫秒单位 |
| jetcache.local.${area}.expireAfterAccessInMillis | 0 | 仅 local 类型的缓存有效,毫秒单位,最大不活动间隔 |
以上方案仅支持手工控制缓存,但是 springcache 方案中的方法缓存特别好用,给一个方法添加一个注解,方法就会自动使用缓存。jetcache 也提供了对应的功能,即方法缓存。
package com.example.demo.controller;import com.alicp.jetcache.anno.*;
import com.example.demo.entity.User;
import com.example.demo.service.IUserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;/*** @author 蔡定努* @date 2023/10/05 14:41*/
@RestController
public class CacheController {@Resourceprivate IUserService userService;/*** 使用缓存* @author 蔡定努*/@GetMapping("get")@Cached(name = "user:", key = "#id", expire = 36000, cacheType = CacheType.BOTH)@CacheRefresh(refresh = 5,timeUnit = TimeUnit.MINUTES) //定时刷新缓存public User get(String id) {return userService.getById(id);}@GetMapping("areaGet")@Cached(area = "demo",name = "user:", key = "#id", expire = 36000, cacheType = CacheType.REMOTE)public User areaGet(String id) {return userService.getById(id);}/*** * 删除缓存* @author 蔡定努*/@GetMapping("in")@CacheInvalidate(name = "user:", key = "#id")public void invaid(String id) {
// 数据处理逻辑}/*** 更新缓存* @author 蔡定努*/@PostMapping("upadte")@CacheUpdate(name = "user:", key = "#id", value = "#user")public void upadte(@RequestBody User user) {
// 跟新useruserService.updateById(user);
// int a=1/0; //缓存不一致}}
设置后,每 1 分钟在控制台输出缓存数据命中信息
2023-10-05 16:15:00.013 INFO 16027 --- [DefaultExecutor] c.alicp.jetcache.support.StatInfoLogger : jetcache stat from 2023-10-05 16:14:28,692 to 2023-10-05 16:15:00,003
cache | qps| rate| get| hit| fail| expire|avgLoadTime|maxLoadTime
----------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------
demo_user:| 0.08| 50.00%| 2| 1| 0| 0| 149.0| 149
----------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------
总结
- jetcache 是一个类似于 springcache 的缓存解决方案,自身不具有缓存功能,它提供有本地缓存与远程缓存多级共同使用的缓存解决方案
- 注意数据进入远程缓存时的类型转换问题
- jetcache 提供方法缓存,并提供了对应的缓存更新与刷新功能
- jetcache 提供有简单的缓存信息命中报表方便开发者即时监控缓存数据命中情况
相关文章:
SpringBoot 整合 jetcache缓存
目前 jetcache 支持的本地缓存方案有两种,远程缓存支持两种,分别如下: 本地缓存(Local) LinkedHashMapCaffeine 远程缓存(Remote) Redis Tair 依赖导入 <dependency><groupId>…...
HTML5+CSS3+移动web 前端开发入门笔记(二)HTML标签详解
HTML标签:排版标签 排版标签用于对网页内容进行布局和样式的调整。下面是对常见排版标签的详细介绍: <h1>: 定义一级标题,通常用于标题栏或页面主要内容的标题。<p>: 定义段落,用于将文字分段展示,段落之…...
Maven 配置阿里云镜像
1. 查找maven setting.xml配置文件 find / -name "setting.xml" 2. 添加阿里云镜像 修改maven根目录下的conf文件夹中的setting.xml文件中的mirrors下添加mirror标签 <settings> <localRepository>E:\Maven\repository</localRepository> <…...
矢量图绘制软件EazyDraw mac中文版软件介绍
EazyDraw mac是一款功能强大且易于使用的矢量绘图软件。 EazyDraw mac软件介绍 矢量绘图工具:EazyDraw 提供了一套全面的矢量绘图工具,包括直线、曲线、多边形、文本框、图形填充等。用户可以使用这些工具创建和编辑精确的矢量图形,无论是简…...
Cocos Creator3.8 项目实战(四)巧用九宫格图像拉伸
一、为什么要使用九宫格图像拉伸 相信做过前端的同学都知道,ui (图片)资源对包体大小和内存都有非常直接的影响。 通常ui 资源都是图片,也是最占资源量的资源类型,游戏中的ui 资源还是人机交互的最重要的部分ÿ…...
怎么使用jenkins设置web自动打包
在Jenkins中设置Web自动打包需要完成以下步骤: 1.环境基础 安装Jenkins:首先,你需要在服务器上安装Jenkins。 你可以从Jenkins官网下载Jenkins的安装包,并按照官方指导进行安装。 2.使用jenkins设置web自动打包步骤 创建Jenk…...
完美解决 flex 实现一行三个,显示多行,左对齐
效果图 代码 <body><section class"content"><div class"item">元素</div><div class"item">元素</div><div class"item">元素</div><div class"item">元素</di…...
初识Spring
目录 1.Spring 基础 2.传统程序开发 3.IoC程序开发(解耦) 4.DI 4.1 IoC 和 DI 有什么区别 1.Spring 基础 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区&…...
Mybatis 使用参数时$与#的区别
之前我们介绍了mybatis中参数的使用,本篇我们在此基础上介绍Mybatis中使用参数时$与#的区别。 如果您对mybatis中参数的使用不太了解,建议您先进行了解后再阅读本篇,可以参考: Mybatis参数(parameterType)https://blog.csdn.net…...
解锁Spring Boot的强大配置功能:@ConfigurationProperties与@PropertySources详解
解锁Spring Boot的强大配置功能:ConfigurationProperties与PropertySources详解 前言什么是ConfigurationProperties和PropertySourcesConfigurationProperties的使用步骤 1: 创建 Java POJO 类步骤 2: 配置类步骤 3: 配置文件步骤 4: 注入配置属性 PropertySources…...
Java和Vue字符串加密
字符串加密 AES 加密算法 在 Java 中,可以使用不同的加密算法来对字符串进行加密。以下是使用 AES 加密算法的示例代码,演示如何对一个字符串进行加密: import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java…...
Java:java版结巴分词:jieba-analysis
文档 https://github.com/huaban/jieba-analysishttps://mvnrepository.com/artifact/com.huaban/jieba-analysis 依赖 <!-- https://mvnrepository.com/artifact/com.huaban/jieba-analysis --> <dependency><groupId>com.huaban</groupId><art…...
java生成一个符合密码学和安全性的随机秘钥
有时 我们在生成token 或者完成某种加密形式时会需要一个秘钥 但是 有些时候 项目开发并没有规定用什么秘钥 但是 秘钥都是要有一定格式规范的 我们可以通过以下代码生成一个随机秘钥 import java.security.SecureRandom; import java.util.Base64;public class TokenGenerat…...
C++ - 右值引用 和 移动拷贝
右值引用 我们先来了解什么是左值,什么是右值: 左值 和 有值 区分 首先,左值 和 右值 并不是完全意味着 在 "" 左边的就是 左值 ; 在 "" 右边的就是右值。这是不一定的。只能说,在左边的大概率是…...
项目成员积分规则
在当下的项目/团队管理种,如何让成员能清晰的看到,自己的工作、努力在团队种属于那个段位,通过这个形式,并配合其他方式去点燃成员的进步之心。以积分的形式,代替绩效考核,一些零散的想法,欢迎各…...
Linux CentOS7 vim多窗口编辑
我们在用vim编辑文件时,有各种需求。如有时需要在多个文件之间来回操作,一会关闭一个文件,一会再打开另外一个文件,这样来回操作显得太笨拙。有时,vim编辑多行的大文件,来回查看、编辑前面一部分及最后一部…...
git使用,一点点
查看自己有没有安装git git --version 如果没有安装请执行sudo yum install -y git来安装 git 指令 git log 查看日志 git pull 同步远端和本地仓库 这就是冲突的报错: 所以这个时候你要同步一下git pull...
第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第八节 - 如何在 C/C++、Python 和 Java 中分割字符串?)
通过某些分隔符分割字符串是一项非常常见的任务。例如,我们有一个文件中以逗号分隔的项目列表,并且我们希望数组中包含各个项目。 几乎所有编程语言都提供按某些分隔符分割字符串的函数。 目录 在C中: 在 C++ 中 方法一:使用C++的stringstream API...
【Java】语法特性篇
语法特性篇 Java对象的比较 1. 对象比较的问题 Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。那为什么可以比较? 因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法…...
LeetCode 热题 100 之 138. 随机链表的复制 148. 排序链表 23. 合并 K 个升序链表 146. LRU 缓存
138. 随机链表的复制 148. 排序链表 23. 合并 K 个升序链表 146. LRU 缓存 138. 随机链表的复制 /* // Definition for a Node. class Node {int val;Node next;Node random;public Node(int val) {this.val val;this.next null;this.random null;} } */class Solution {pub…...
PHP生存法则的庖丁解牛
“PHP 生存法则”,常被误解为“如何写出更快的代码”或“如何迁移到 Go/Java”。 但本质上,在 AI 崛起、语言百家争鸣的今天,PHP 的生存法则是一场关于“定位”、“进化”与“价值重构”的认知战役。 PHP 没有死,它只是退出了“万…...
3款突破限制的全平台文件翻译工具:高效处理大文件的终极解决方案
3款突破限制的全平台文件翻译工具:高效处理大文件的终极解决方案 【免费下载链接】DeeplxFile 基于Deeplx和Playwright提供的简单易用,快速,免费,不限制文件大小,支持超长文本翻译,跨平台的文件翻译工具 / …...
CKAN:坎巴拉太空计划玩家的模组管理利器
CKAN:坎巴拉太空计划玩家的模组管理利器 【免费下载链接】CKAN The Comprehensive Kerbal Archive Network 项目地址: https://gitcode.com/gh_mirrors/cka/CKAN 作为《坎巴拉太空计划》(KSP)玩家,你是否曾为模组安装的复杂性而困扰?手…...
基于鸿蒙ArkTS开发毕设的效率提升实践:从模板复用到构建优化
在高校毕业设计的开发过程中,时间往往是最大的敌人。尤其是选择鸿蒙ArkTS这类相对较新的技术栈时,很多同学会把大量精力耗费在项目初始化、环境调试和重复性的基础代码编写上,真正用于实现核心业务逻辑的时间反而被压缩。我自己在完成基于鸿蒙…...
互联网产品需求分析助手:SmallThinker-3B-Preview评审PRD与生成用户故事
互联网产品需求分析助手:SmallThinker-3B-Preview评审PRD与生成用户故事 做产品,最怕什么?怕需求说不清,怕文档写不明,怕开发同学看完一脸懵,最后做出来的东西和你想的完全不是一回事。我自己带团队做产品…...
告别参数调试困境:OrcaSlicer工艺参数决策系统3大方案提升打印成功率90%
告别参数调试困境:OrcaSlicer工艺参数决策系统3大方案提升打印成功率90% 【免费下载链接】OrcaSlicer G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.) 项目地址: https://gitcode.com/GitHub_Trending/orc/OrcaSlicer …...
FLUX.1-dev像素艺术终端效果展示:支持多提示词权重分配的精细控制
FLUX.1-dev像素艺术终端效果展示:支持多提示词权重分配的精细控制 1. 像素幻梦创意工坊概览 像素幻梦创意工坊(Pixel Dream Workshop)是基于FLUX.1-dev扩散模型构建的新一代像素艺术生成工具。与传统AI绘图工具不同,它采用了明亮的16-bit像素风格界面设…...
从‘完美数学’到‘工程妥协’:聊聊LTE标准里PSS那三个ZC根索引(25,29,34)为啥是它们
解码LTE同步信号设计:为何PSS的ZC序列锁定25、29、34这三个关键数字? 当一部智能手机从口袋中取出并瞬间接入蜂窝网络时,这个看似简单的动作背后,隐藏着一系列精妙的通信协议设计。其中最关键的第一步——物理层同步,正…...
新手必看!PHI-3 PIXEL QUEST保姆级教程:一键部署像素风AI对话平台
新手必看!PHI-3 PIXEL QUEST保姆级教程:一键部署像素风AI对话平台 1. 环境准备与快速部署 1.1 系统要求 操作系统:支持Windows 10/11、macOS 10.15、主流Linux发行版硬件配置: 最低:8GB内存 4GB显存(NV…...
