当前位置: 首页 > news >正文

Redis与Caffeine的结合使用详解(高效的二级缓存解决方案)

目录

    • 一、Redis与Caffeine的结合使用
      • (一)引入依赖
      • (二)配置缓存
      • (三)配置 Caffeine 缓存
      • (四)配置 Redis 缓存
      • (五)使用缓存
    • 二、总结

一、Redis与Caffeine的结合使用

Redis 和 Caffeine 是两种广受欢迎的缓存技术,Redis 是一个高性能的键值数据库,提供了数据持久化和分布式缓存功能;Caffeine 是一个高性能的缓存库,访问速度快,能够提供接近内存的访问效率。将 Redis 和 Caffeine 结合起来,可以构建一个高效的二级缓存解决方案。Caffeine 作为一级缓存,提供快速访问,而 Redis 作为二级缓存,解决数据共享和持久化问题。

(一)引入依赖

pom.xml 文件中添加以下依赖:

<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.9.2</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.8.1</version>
</dependency>

(二)配置缓存

application.yml 中配置 Redis 的连接信息:

spring:redis:host: 127.0.0.1port: 6379database: 0timeout: 10000mslettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0

(三)配置 Caffeine 缓存

import com.github.ben.manes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableCaching
public class CaffeineConfig {@Beanpublic CacheManager caffeineCacheManager() {return new CaffeineCacheManager(Caffeine.newBuilder().initialCapacity(128).maximumSize(1024).expireAfterWrite(60, TimeUnit.SECONDS).build());}
}

(四)配置 Redis 缓存

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@EnableCaching
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}

(五)使用缓存

在业务代码中,可以使用 @Cacheable@CachePut@CacheEvict 注解来简化缓存操作。

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Cacheable(cacheNames = "order", key = "#id")public Order getOrderById(Long id) {// 查询数据库return orderMapper.selectById(id);}@CachePut(cacheNames = "order", key = "#order.id")public Order updateOrder(Order order) {// 更新数据库orderMapper.updateById(order);// 更新 RedisredisTemplate.opsForValue().set("order:" + order.getId(), order, 120, TimeUnit.SECONDS);return order;}@CacheEvict(cacheNames = "order", key = "#id")public void deleteOrder(Long id) {// 删除数据库记录orderMapper.deleteById(id);// 删除 Redis 缓存redisTemplate.delete("order:" + id);}
}

二、总结

通过结合 Redis 和 Caffeine,可以构建一个高效的二级缓存解决方案。Caffeine 作为一级缓存,提供快速的本地访问;Redis 作为二级缓存,提供数据的持久化和分布式共享。这种架构在提高数据访问速度、减少数据库压力方面具有显著优势。希望本文的示例和讲解对您有所帮助,如果您在实现二级缓存时有任何疑问,欢迎随时交流探讨!

相关文章:

Redis与Caffeine的结合使用详解(高效的二级缓存解决方案)

目录 一、Redis与Caffeine的结合使用&#xff08;一&#xff09;引入依赖&#xff08;二&#xff09;配置缓存&#xff08;三&#xff09;配置 Caffeine 缓存&#xff08;四&#xff09;配置 Redis 缓存&#xff08;五&#xff09;使用缓存 二、总结 一、Redis与Caffeine的结合…...

leetcode 322. Coin Change

这道题也是完全背包问题。注意与第518题和第377题对比。 这道题要求的是最少可以用多少个物品装满背包&#xff0c;不关心所选物品的组合方式和排列方式。因此&#xff0c;外层循环既可以是对物品的遍历&#xff0c;也可以是对容量的遍历。 第518题&#xff0c;要求的是装满背…...

mac|使用scrcpy实现无线Android投屏

scrcpy是一个开源项目&#xff0c;从项目的releases可以得知它适用于windows、linux、mac github&#xff1a;https://github.com/Genymobile/scrcpy/releases github中提供了应用于mac系统的静态版本&#xff08;也就是上图的scrcpy-macos-aarch64-v3.1.tar.gz和scrcpy-macos…...

2025年04月11日Github流行趋势

项目名称&#xff1a;ml-course 项目地址url&#xff1a;https://github.com/girafe-ai/ml-course项目语言&#xff1a;Jupyter Notebook历史star数&#xff1a;2880今日star数&#xff1a;207项目维护者&#xff1a;neychev, girafeai, v-goncharenko, vmarchenkoff, HCL-271项…...

深入浅出Redis 缓存使用问题 | 长文分享

目录 数据一致性 先更新缓存&#xff0c;后更新数据库【一般不考虑】 先更新数据库&#xff0c;再更新缓存【一般不考虑】 先删除缓存&#xff0c;后更新数据库 先更新数据库&#xff0c;后删除缓存【推荐】 怎么选择这些方案&#xff1f;采用哪种合适&#xff1f; 缓存…...

PINN:用深度学习PyTorch求解微分方程

神经网络技术已在计算机视觉与自然语言处理等多个领域实现了突破性进展。然而在微分方程求解领域&#xff0c;传统神经网络因其依赖大规模标记数据集的特性而表现出明显局限性。物理信息神经网络(Physics-Informed Neural Networks, PINN)通过将物理定律直接整合到学习过程中&a…...

Ubuntu vs CentOS:Shell 环境加载机制差异分析

CentOS与Ubuntu Shell环境加载机制差异及解决方案 一、问题现象还原 在 Ubuntu 系统中&#xff0c;希望登录时 /etc/profile.d/ipenv.sh 脚本未自动执行&#xff0c;而在 CentOS 上正常工作的根本原因是&#xff1a; Ubuntu 和 CentOS 采用了不同的 shell 初始化机制&#x…...

在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级配置的详细步骤

在 macOS 上修改 最大文件描述符限制&#xff08;Too many open files&#xff09; 和 网络端口相关参数 需要调整系统级配置。以下是详细步骤&#xff1a; 在 macOS 上修改 最大文件描述符限制&#xff08;Too many open files&#xff09; 和 网络端口相关参数 需要调整系统级…...

C语言 |位域结构体

在C语言中&#xff0c;位域结构体&#xff08;Bit-field Structure&#xff09;是一种通过按位分配内存优化存储空间的数据结构&#xff0c;特别适用于需要精确控制二进制位操作的场景&#xff08;如嵌入式开发、硬件寄存器操作等&#xff09;。以下是关于位域结构体的核心要点…...

Charles抓包-安装和IOS抓包指导

网络抓包工具使用指南 下载安装 目前市面上主流的抓包工具包括Charles和Sniff Master。其中Charles是一款老牌抓包工具&#xff0c;功能强大&#xff1b;而Sniff Master作为后起之秀&#xff0c;界面简洁&#xff0c;操作更加人性化。 建议从官网下载最新版本&#xff1a; …...

Redis 学习目标

&#x1f3af; Redis 学习目标&#xff08;开发者视角&#xff09; ✅ 一、学习完成后能掌握的核心能力&#xff1a; 分类具体内容&#x1f4e6; 基础能力熟练掌握 Redis 五大数据结构&#xff08;String、List、Hash、Set、ZSet&#xff09;&#xff0c;会用也会选对场景&am…...

Redis最佳实践——性能优化技巧之Pipeline 批量操作

Redis Pipeline批量操作在电商应用中的性能优化技巧 一、Pipeline核心原理与性能优势 1. 工作机制对比&#xff1a; sequenceDiagramtitle 常规请求 vs Pipeline请求# 常规模式Client->>Redis: 命令1Redis-->>Client: 响应1Client->>Redis: 命令2Redis--&g…...

Redis 集群(Cluster)

1. Redis 集群概述 Redis 集群是一种分布式架构&#xff0c;旨在提供数据分区和高可用性。它能够通过将数据分散到多个节点上来扩展 Redis&#xff0c;使其能够处理更多的数据量和更高的并发请求。Redis 集群实现了自动分片、故障转移和复制等功能。 Redis 集群与传统的单节点…...

XSS 跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本

#MXSS &#xff1a; https://www.fooying.com/the-art-of-xss-1-introduction/ #UXSS &#xff1a; Universal Cross-Site Scripting&#xff08;一般是浏览器自身的问题&#xff09; UXSS 是利用浏览器或者浏览器扩展漏洞来制造产生 XSS 并执行代码的一种攻击类型。 MICR…...

数据库主从延迟全解析:原因、影响与解决之道

目录 一、引言&#xff1a;理解数据库主从架构 二、数据库主从延迟的定义与测量 2.1 主从延迟的技术定义 2.2 如何测量主从延迟 2.3 主从延迟对系统的影响 三、主从延迟的常见原因分析 3.1 网络延迟因素 3.1.1 网络质量与带宽限制 3.1.2 地理位置分布造成的延迟 3.2 …...

BERT、T5、ViT 和 GPT-3 架构概述及代表性应用

BERT、T5、ViT 和 GPT-3 架构概述 1. BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09; 架构特点 基于 Transformer 编码器&#xff1a;BERT 使用多层双向 Transformer 编码器&#xff0c;能够同时捕捉输入序列中每个词的左右上下文信息…...

第十七天 - Jenkins API集成 - 流水线自动化 - 练习:CI/CD流程优化

前言 在DevOps实践中&#xff0c;持续集成与持续交付&#xff08;CI/CD&#xff09;是现代软件工程的核心支柱。作为业界使用最广泛的自动化服务器&#xff0c;Jenkins凭借其强大的插件生态和灵活的流水线配置能力&#xff0c;成为企业级CI/CD落地的首选工具。本文将深入解析J…...

SageAttention2

“SageAttention2: Efficient Attention with Thorough Outlier Smoothing and Per-thread INT4 Quantization”由Jintao Zhang等人撰写。文章提出SageAttention2&#xff0c;通过线程级INT4量化、Q矩阵平滑、两级累加策略等技术&#xff0c;在提升注意力计算效率的同时保持精度…...

.NET WPF 可视化树(Visual Tree)

.NET WPF 可视化树&#xff08;Visual Tree&#xff09; WPF 的可视化树&#xff08;Visual Tree&#xff09;是描述用户界面元素层级关系的核心概念之一&#xff0c;它与逻辑树&#xff08;Logical Tree&#xff09;共同构成了 WPF 的 UI 架构。以下是关于 WPF 可视化树的详细…...

磁盘存储下红黑树、B 树与 B + 树的原理、操作及对比

前置知识 磁盘 在计算机系统中&#xff0c;数据存储与检索效率深刻影响着整体性能。磁盘作为大容量数据的主要载体&#xff0c;其独特的 I/O 特性与树状数据结构的结合&#xff0c;催生出 B 树与 B 树这两种经典方案。了解它们如何适配磁盘存储&#xff0c;是揭开数据库、文…...

kubernetes》》k8s》》Volume 数据卷 PVC PV NFS

为啥需要数据卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重…...

支持多格式且免费的图片转换工具推荐

软件介绍 今天要给大家推荐一款超好用的开源图片格式转换工具。这款工具完全免费&#xff0c;没有广告的干扰&#xff0c;让用户在使用过程中极为舒心。 ImageConverter图片格式转换 这款工具使用起来相当便捷&#xff0c;无需进行安装操作&#xff0c;只要轻轻双击图标&…...

DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额—操作篇

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读396次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...

K8S-证书更新时-误删除组件-

K8S 证书更新时-吴删除组件 [rootmaster ~] eth0 172.17.64.32 # docker rm -f docker ps | grep -E apiserver|scheduler|controller-manager| awk {print$1} 7856f2a3068e 2e1a6956d8a1 e9e3cb7870a9 31b19f4e2b22 c028146f88a5 abe4207808a3 [rootmaster ~] eth0 172.17.…...

第二章 Python爬虫篇—数据解析与提取

目录 一.数据解析概述 二.re解析和正则表达式 三.bs4解析-HTML语法 四.Xpath解析 此章节主要讲解&#xff1a;数据解析概述、re模块、bs4解析-html语法、xpath解析以及正则表达式。其中正则表达式我已经写过相关笔记&#xff0c;这里浅略叙述&#xff0c;如果不懂请看我笔记…...

数据仓库标准库模型架构相关概念浅讲

数据仓库与模型体系及相关概念 数据仓库与数据库的区别可参考&#xff1a;数据库与数据仓库的区别及关系_数据仓库和数据库-CSDN博客 总之&#xff0c;数据库是为捕获数据而设计&#xff0c;数据仓库是为分析数据而设计 数据仓库集成工具 在一些大厂中&#xff0c;其会有自…...

【区块链+ 人才服务】特范云区块链教学管理平台 | FISCO BCOS 应用案例

北京特范云科技有限公司利用大数据与人工智能等核心技术优势&#xff0c; 构建了“学、练、赛、评”一体化智慧体育课堂&#xff0c;促进教育技术、体育科学、IT 技术与体育教学的深度融合。公司首次提出了“体育动作积木”的教学概念&#xff0c; 通过区块链技术将学生的体测体…...

第一节:React 基础篇-React虚拟DOM原理及Diff算法优化策略

必考点&#xff1a;虚拟DOM树对比&#xff08;同级比较、Key的作用、组件类型判断&#xff09; 延伸&#xff1a;React 18中并发更新对Diff算法的影响 React虚拟DOM原理及Diff算法优化策略 虚拟DOM核心原理 概念&#xff1a; • 虚拟DOM&#xff08;Virtual DOM&#xff09;…...

MQTT的构成、使用场景、工作原理介绍

一、MQTT内容简介 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议【适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备之间的…...

idea光标变成白色方块的解决方法

在使用 IDEA 进行编程时&#xff0c;你可能会遇到这样一个情况&#xff1a;原本纤细的光标突然变成了白色粗块&#xff0c;这不仅影响视觉体验&#xff0c;还可能在输入时带来困扰。别担心&#xff0c;本文将为你详细剖析该问题出现的原因&#xff0c;并提供有效的解决办法。​…...

python manimgl数学动画演示_微积分_线性代数原理_ubuntu安装问题[已解决]

1.背景 最近调研python opencv, cuda加速矩阵/向量运算, 对于矩阵的线性变换, 秩, 转秩, 行列式变化等概概念模糊不清. 大概课本依旧是天书, 于是上B站搜索线性代数, 看到 3Blue1Brown 线性变换本质 视频, 点击观看. 惊为天人 --> 豁然开朗 --> 突然顿悟 --> 开心不已…...

如何为C++实习做准备?

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1…...

Linux 安装 vscode

使用包管理器安装&#xff08;推荐&#xff09; 对于基于 Debian 的系统&#xff08;如 Ubuntu&#xff09;&#xff1a; sudo apt update sudo apt install software-properties-common apt-transport-https wget -qO- https://packages.microsoft.com/keys/microsoft.asc …...

淘宝商品数据实时抓取 API 开发指南:从接口申请到数据解析实战

一、引言​ 在当今电商蓬勃发展的时代&#xff0c;淘宝作为国内电商巨头&#xff0c;其平台上汇聚了海量商品信息。对于电商从业者、数据分析爱好者以及众多依赖淘宝商品数据开展业务的企业而言&#xff0c;能够实时获取淘宝商品数据具有极高价值。例如&#xff0c;电商运营者…...

明远智睿SSD2351核心板在物联网领域的应用实践

物联网作为当今科技发展的热门领域&#xff0c;将无数设备连接在一起&#xff0c;实现数据的采集、传输与共享&#xff0c;构建起一个智能化的世界。在这庞大的物联网体系中&#xff0c;核心板扮演着至关重要的角色&#xff0c;明远智睿SSD2351核心板以其独特优势&#xff0c;在…...

这种情况是应为VScode的版本太新了,更新到1.86版本后要求远程连接服务器的内核版本不符合条件

这种情况是应为VScode的版本太新了&#xff0c;更新到1.86版本后要求远程连接服务器的内核版本不符合条件 解决方法 vscode降级&#xff0c;使用1.86以前的版本。亲测这种方法成功解决 首先关闭VSCode自动更新 Windows下载1.85版本链接&#xff1a;https://update.code.visua…...

996引擎-源码学习:PureMVC Lua 中的 Facade 类

996引擎-源码学习:PureMVC Lua 中的 Facade 类 1. 核心概念1.1 外观模式1.2 多例模式2. 关键组件NotificationController:ModelView3. 主要功能4. 初始化流程5. 通信机制6. 生命周期管理1. Facade 初始化流程图2. 发送通知时序图中介者 PlayerBestRingLayerMediatorOpenLayer …...

前端学习10—Ajax

1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大优势为&#xff1a;无刷新获取数据 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方…...

python的多线程和多进程程序编程

CPU密集型使用多进程&#xff0c;IO密集型使用多线程 查看进程ID和线程ID的命令分别是os.getpid()和threading.current_thread() 多进程使用multiprocessing就可以了&#xff0c;通常使用进程池来完成操作&#xff0c;阻塞主进程使用join方法 多线程使用threading模块&#…...

Python代码解释

文章目录 代码解析执行过程等价写法其他类似操作 这段代码使用了 Python 的 map() 函数和 lambda 表达式来对列表中的每个元素进行平方运算。让我详细解释一下&#xff1a; 代码解析 numbers [1, 2, 3, 4] squared list(map(lambda x: x**2, numbers))numbers [1, 2, 3, …...

DNS正反向解析复习,DNS主从服务,转发服务及DNS和nginx联合案例(不断更新)

正向解析 1、配置主机名 [rootlocalhost ~]# dnf install bash-completion -y #一个按tap键补全的软件 [rootlocalhost ~]# hostnamectl hostname dns #改主机名为dns [rootlocalhost ~]# exit ssh root你的IP地址 要重启才会生效2、安装bind [rootdns ~]# dnf install b…...

甜心速达智慧潮流精选超市、即时零售新业态,打造可持续发展商业模式

四川甜心速达科技有限公司、现公司运营高管团队均为美团高级运营师&#xff0c;公司高管团队人均获得“全国工商联人才交流服务中心”创业指导师、市场营销师等、公司致力于优化线上店铺人效比和资源匹配等问题&#xff0c;已经实现了对即时零售行业的资源整合&#xff0c;并融…...

大白话聊MySQL覆盖索引

目录 一、什么是覆盖索引&#xff1f;二、使用了覆盖索引 vs 没使用覆盖索引的区别三、例子说明四、总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支持一下&#xff0c;感谢&#x1f917;&#xff01; …...

C++ inline和define(宏)

文章目录 Inline 函数是什么意思&#xff1f;C中哪些函数不能声明为inline?内联(inline)函数和 #define&#xff08;宏&#xff09; Inline 函数是什么意思&#xff1f; inline是内联的意思&#xff0c;可以定义比较小的函数。因为函数频繁调用会占用很多的栈空间&#xff0c…...

Python中的eval()函数详解

文章目录 Python中的eval()函数详解基本语法基本用法安全性问题安全使用建议实际应用场景与exec()的区别性能考虑总结 Python中的eval()函数详解 eval()是Python的一个内置函数&#xff0c;用于执行字符串形式的Python表达式并返回结果。它是一个强大但需要谨慎使用的函数。 …...

rancher 解决拉取dashboard-shell镜像失败的问题

问题背景 在 Kubernetes 集群中部署 Rancher 后&#xff0c;点击右上角的 "Shell" 按钮时&#xff0c;Rancher 会动态创建一个 dashboard-shell-xxxxx Pod&#xff0c;用于提供 Web 终端功能。然而&#xff0c;由于默认镜像 rancher/shell:v0.1.21 托管在 Docker Hu…...

在Ubuntu服务器上安装Docker(支持Ubuntu 20.04/22.04等版本):

1. 卸载旧版本&#xff08;如有&#xff09; 如果系统曾安装过旧版Docker&#xff0c;先清理残留&#xff1a; sudo apt remove docker docker-engine docker.io containerd runc2. 添加Docker官方仓库 安装依赖工具 sudo apt update sudo apt install -y ca-certificates …...

【Linux 进程控制】—— 进程亦生生不息:起于鸿蒙,守若空谷,归于太虚

欢迎来到一整颗红豆的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由一整颗红豆原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创…...

K8s常用基础管理命令(一)

基础管理命令 基础命令kubectl get命令kubectl create命令kubectl apply命令kubectl delete命令kubectl describe命令kubectl explain命令kubectl run命令kubectl cp命令kubectl edit命令kubectl logs命令kubectl exec命令kubectl port-forward命令kubectl patch命令 集群管理命…...

WebChat 一款非常好用的浏览器侧边栏 AI 问答插件

文章目录 使用方法及效果展示划线引用自定义工具自定义模型设置 主要功能1. 划线引用功能2. 自定义划线工具3. 聊天功能4. 历史记录管理5. 界面特性 安装方法方法一&#xff1a;直接安装发布版本&#xff08;推荐&#xff09;方法二&#xff1a;从源码构建安装&#xff08;开发…...