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

缓存实战:Redis 与本地缓存

引言

在现代互联网应用中,缓存是提升系统性能和用户体验的关键技术之一。通过将频繁访问的数据存储在快速访问的存储介质中,可以显著减少对数据库的直接访问压力,从而提高系统的响应速度和吞吐量。

本文将从实战的角度出发,详细介绍如何使用 Redis 和本地缓存(如 Caffeine)来优化应用性能。我们将分别探讨 RedisTemplate 操作缓存、@Cacheable 方法缓存以及 Caffeine 本地缓存的使用场景和实现细节。


一、RedisTemplate 操作缓存

1. Redis 简介

Redis 是一个开源的高性能键值存储系统,支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),广泛应用于缓存、消息队列、实时分析等领域。

2. 在 Spring Boot 中配置 Redis

首先,在 pom.xml 中添加 Redis 依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
</dependencies>

然后,在 application.properties 中配置 Redis 连接信息:

spring.redis.host=localhost  
spring.redis.port=6379  
spring.redis.password= 

 

3. 使用 RedisTemplate 进行基本操作

RedisTemplate 是 Spring Data Redis 提供的核心模板类,用于简化 Redis 的操作。

示例代码

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.redis.core.RedisTemplate; 
import org.springframework.stereotype.Service; @Service 
public class CacheService {@Autowired private RedisTemplate<String, Object> redisTemplate;public void setValue(String key, Object value) {redisTemplate.opsForValue().set(key,  value);}public Object getValue(String key) {return redisTemplate.opsForValue().get(key); }public void deleteKey(String key) {redisTemplate.delete(key); }
}

 

  • opsForValue():操作字符串类型的键值对。
  • set(key, value):设置键值对。
  • get(key):获取指定键的值。
  • delete(key):删除指定键。
4. 设置过期时间

为了避免缓存数据无限期占用内存,我们可以为键设置过期时间。

public void setValueWithExpire(String key, Object value, long expireSeconds) {redisTemplate.opsForValue().set(key,  value, expireSeconds);
}

 

  • expireSeconds:过期时间(单位:秒)。
5. 批量操作

RedisTemplate 还支持批量操作,以提高效率。

public void batchSetValue(Map<String, Object> entries) {redisTemplate.opsForValue().multiSet(entries); 
}public Map<String, Object> batchGetValue(Collection<String> keys) {return redisTemplate.opsForValue().multiGet(keys); 
}

 

二、@Cacheable 方法缓存

1. Spring Cache 简介

Spring Cache 是 Spring 提供的一套缓存抽象层,支持多种缓存实现(如 Redis、Caffeine、Ehcache 等)。@Cacheable 是 Spring Cache 中最常用的注解之一,用于标注需要缓存的方法。

2. 配置 Spring Cache

application.properties 中启用缓存:

spring.cache.type=redis  

 

3. 使用 @Cacheable 注解

示例代码:

import org.springframework.cache.annotation.Cacheable; 
import org.springframework.stereotype.Service; @Service 
public class UserService {@Cacheable(value = "users", key = "#id")public User getUserById(Long id) {// 从数据库查询用户 return userRepository.findById(id).orElse(null); }
}

 

  • value = "users":指定缓存的名称。
  • key = "#id":指定缓存的键,使用方法参数 id 的值。
4. 自定义缓存配置

可以通过 @CacheConfig 注解为类级别配置默认的缓存名称和键生成策略。

import org.springframework.cache.annotation.CacheConfig; 
import org.springframework.cache.annotation.Cacheable; 
import org.springframework.stereotype.Service; @Service 
@CacheConfig(cacheNames = "users")
public class UserService {@Cacheable(key = "#id")public User getUserById(Long id) {// 从数据库查询用户 return userRepository.findById(id).orElse(null); }
}

 

三、Caffeine 本地缓存

1. Caffeine 简介

Caffeine 是一个高性能的 Java 缓存库,由 Google 开发并维护。它支持本地缓存,并提供了丰富的功能(如自动过期、容量限制、统计信息等)。

2. 在 Spring Boot 中集成 Caffeine

首先,在 pom.xml 中添加 Caffeine 依赖:

<dependencies><dependency><groupId>com.github.benmanes</groupId> <artifactId>jcache</artifactId><version>1.0.0</version></dependency>
</dependencies>

 然后,在配置类中配置 Caffeine 缓存管理器:

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.cache.CacheManager; 
import org.springframework.cache.caffeine.CaffeineCacheManager; 
import com.github.benmanes.caffeine.jcache.JCache; @Configuration 
public class CacheConfig {@Bean public CacheManager cacheManager() {CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager("users");caffeineCacheManager.setCaffeine(JCache.Caffeine.newBuilder() .maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).build());return caffeineCacheManager;}
}

 

3. 使用 @Cacheable 结合 Caffeine

与 Redis 类似,我们可以使用 @Cacheable 注解结合 Caffeine 实现本地缓存。

import org.springframework.cache.annotation.Cacheable; 
import org.springframework.stereotype.Service; @Service 
public class UserService {@Cacheable(value = "users", key = "#id")public User getUserById(Long id) {// 从数据库查询用户 return userRepository.findById(id).orElse(null); }
}

四、总结与选择建议

1. 总结
  • Redis:适合分布式缓存场景,支持高并发和大数据量。
  • @Cacheable:简化缓存逻辑的实现,支持多种缓存后端。
  • Caffeine:适合本地缓存场景,性能优异且配置简单。
2. 选择建议
  • 如果需要分布式缓存且数据量较大,推荐使用 Redis。
  • 如果需要本地缓存且追求高性能,推荐使用 Caffeine。
  • 如果希望统一管理缓存逻辑,可以结合 @Cacheable 和具体的缓存实现(如 Redis 或 Caffeine)。

相关文章:

缓存实战:Redis 与本地缓存

引言 在现代互联网应用中&#xff0c;缓存是提升系统性能和用户体验的关键技术之一。通过将频繁访问的数据存储在快速访问的存储介质中&#xff0c;可以显著减少对数据库的直接访问压力&#xff0c;从而提高系统的响应速度和吞吐量。 本文将从实战的角度出发&#xff0c;详细…...

网络工程师 (28)IEEE802标准

前言 IEEE 802标准是由电气和电子工程师协会&#xff08;IEEE&#xff09;制定的一组局域网&#xff08;LAN&#xff09;和城域网&#xff08;MAN&#xff09;标准&#xff0c;定义了网络中的物理层和数据链路层。 一、起源与背景 IEEE 802又称为LMSC&#xff08;LAN/MAN Stand…...

背包问题1

核心&#xff1a; // f[i][j] 表示只看前i个物品&#xff0c;总体积是j的情况下&#xff0c;总价值是多少 //res maxx(f[n][]0-v] //f[i][j]: //1 不选第i个物品 f[i][j] f[i-1][j] //2 选第i个物品 f[i][j] f[i-1][j-v[i]] w[i]...

Spring 中的设计模式详解

控制反转(IoC)和依赖注入(DI) IoC(Inversion of Control,控制反转) 是 Spring 中一个非常非常重要的概念&#xff0c;它不是什么技术&#xff0c;而是一种解耦的设计思想。IoC 的主要目的是借助于“第三方”(Spring 中的 IoC 容器) 实现具有依赖关系的对象之间的解耦(IOC 容器…...

OpenAI 实战进阶教程 - 第十一节 : 文档搜索与摘要生成

读者群体&#xff1a;面向哪类从业人员&#xff1f; 软件工程师 / 后端开发人员&#xff1a;需要在系统中集成对文档的搜索和问答功能。技术支持 / 运维人员&#xff1a;需要快速查询、提炼大批量文档以提供高效支持。项目经理 / 产品经理&#xff1a;想要更好地理解并利用已有…...

scss混合优化媒体查询书写

采用scss的混合和继承优化css的媒体查询代码书写 原写法 .header {width: 100%; } media (min-width: 320px) and (max-width: 480px) {.header {height: 50px;} } media (min-width: 481px) and (max-width: 768px) {.header {height: 60px;} } media (min-width: 769px) an…...

人类的算计与机器的算计

近日&#xff0c;国外一视频网站博主通过设定&#xff0c;使DeepSeek和ChatGPT开展了一场国际象棋对弈。前十分钟双方在正常对弈&#xff0c;互有输赢&#xff0c;且ChatGPT逐渐占优。随后DeepSeek突然以对话方式告诉ChatGPT&#xff0c;国际象棋官方刚刚更新了比赛规则&#x…...

android的ViewBinding的使用

参考&#xff1a; 安卓开发中的ViewBinding使用...

rockmq配置出现的问题

环境注意事项 java要配置javahome-- java8&#xff0c;并且rockmq配置 根目录 解决方法&#xff1a; https://blog.csdn.net/weixin_46661658/article/details/133753627 如果执行第二步报错jar的路径 命令&#xff1a; start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTop…...

7 使用 Pydantic 验证 FastAPI 的请求数据

FastAPI 是一个快速、现代的 Web 框架&#xff0c;它提供了自动生成 OpenAPI 文档的功能&#xff0c;支持 Pydantic 模型进行请求和响应数据的验证。Pydantic 提供了强大的数据验证功能&#xff0c;可以帮助你确保请求的有效性&#xff0c;自动进行数据转换&#xff0c;并生成详…...

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…...

【10.10】队列-设计自助结算系统

一、题目 请设计一个自助结账系统&#xff0c;该系统需要通过一个队列来模拟顾客通过购物车的结算过程&#xff0c;需要实现的功能有&#xff1a; get_max()&#xff1a;获取结算商品中的最高价格&#xff0c;如果队列为空&#xff0c;则返回 -1add(value)&#xff1a;将价格为…...

Mac安装配置使用nginx的一系列问题

brew安装nginx https://juejin.cn/post/6986190222241464350 使用brew安装nginx&#xff0c;如下命令所示&#xff1a; brew install nginx 如下图所示&#xff1a; 2.查看nginx的配置信息&#xff0c;如下命令&#xff1a; brew info nginxFrom:xxx 这样的&#xff0c;是n…...

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…...

00_Machine Vision_基础介绍

基础概念 由于计算机只能处理离散的数据&#xff0c;所以需要将连续的图片转化为离散的数据。主要包含&#xff1a;空间离散以及灰度值离散 空间离散&#xff1a;将图片的像素点离散化&#xff0c;即将图片的像素点转化为一个个的小方块&#xff0c;即为图片的分辨率。分辨率…...

组件库选择:ElementUI 还是 Ant Design

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

【Kubernetes的SpringCloud最佳实践】有Service是否还需要Eureka?

在 Kubernetes 中部署 Spring Cloud 微服务时&#xff0c;是否还需要 Eureka 取决于具体场景和架构设计。以下是详细的实践建议和结论&#xff1a; 1. Kubernetes 原生服务发现 vs Eureka Kubernetes 自身提供了完善的服务发现机制&#xff08;通过 Service 资源&#xff09;&…...

顺丰数据分析(数据挖掘)面试题及参考答案

你觉得数据分析人员必备的技能有哪些? 数据分析人员需具备多方面技能,以应对复杂的数据处理与解读工作。 数据处理能力:这是基础且关键的技能。数据常以杂乱、不完整的形式存在,需通过清洗,去除重复、错误及缺失值数据,确保数据质量。例如,在电商销售数据中,可能存在价…...

从运输到植保:DeepSeek大模型探索无人机智能作业技术详解

DeepSeek&#xff0c;作为一家专注于深度学习与人工智能技术研究的企业&#xff0c;近年来在AI领域取得了显著成果&#xff0c;尤其在无人机智能作业技术方面展现了其大模型的强大能力。以下是从运输到植保领域&#xff0c;DeepSeek大模型探索无人机智能作业技术的详解&#xf…...

超越LSTM!TCN模型如何精准预测股市波动(附代码)

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;最近我用TCN时间卷积网络预测了标普500指数&#xff08;SPX&#xff09;的每日回报率&#xff0c;发现效果远超传统方法。TCN通过因果卷积和膨胀卷积捕捉时间序列的长期依赖关…...

[每周一更]-(第133期):Go中MapReduce架构思想的使用场景

文章目录 **MapReduce 工作流程**Go 中使用 MapReduce 的实现方式&#xff1a;**Go MapReduce 的特点****哪些场景适合使用 MapReduce&#xff1f;**使用场景1. 数据聚合2. 数据过滤3. 数据排序4. 数据转换5. 数据去重6. 数据分组7. 数据统计8.**统计文本中单词出现次数****代码…...

QML初识

目录 一、关于QML 二、布局定位和锚点 1.布局定位 2.锚点详解 三、数据绑定 1.基本概念 2.绑定方法 3.数据模型绑定 四、附加属性及信号 1.附加属性 2.信号 一、关于QML QML是Qt框架中的一种声明式编程语言&#xff0c;用于描述用户界面的外观和行为&#xff1b;Qu…...

查询已经运行的 Docker 容器启动命令

一、导语 使用 get_command_4_run_container 查询 docker 容器的启动命令 获取镜像 docker pull cucker/get_command_4_run_container 查看容器命令 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run_container 容器id或容器名 …...

项目管理中的13个数据分析思维

01 信度与效度思维 信度&#xff1a;是指一个数据或指标自身的可靠程度&#xff0c;包括准确性和稳定性。 效度&#xff1a;是指一个数据或指标的生成&#xff0c;需贴合它所要衡量的事物&#xff0c;即指标的变化能够代表该事物的变化。 在项目管理中&#xff0c;信度和效度的…...

快速查看ROS节点的CPU和内存占用情况

他们可能是在排查资源泄漏的问题,所以需要监控节点的CPU和内存使用情况。可能他们遇到了节点占用过多资源导致服务器崩溃的情况,需要快速定位问题节点。现有的Linux命令方面,top和htop可以实时查看进程资源使用,但用户想要的是针对ROS节点的,可能需要更针对性的工具。ROS本…...

Centos Stream 10 根目录下的文件夹结构

/ ├── bin -> usr/bin ├── boot ├── dev ├── etc ├── home ├── lib -> usr/lib ├── lib64 -> usr/lib64 ├── lostfound ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin -> usr/sbin ├── srv ├─…...

协议_CAN协议

物理层特征 信号传输原理&#xff1a; CAN控制器根据CAN_L和CAN_H上的电位差来判断总线电平&#xff0c;总线电平分为显性电平&#xff08;CAN_H与CAN_L压差 2v&#xff09;、隐性电平&#xff08;CAN_H与CAN_L压差 0v&#xff09;&#xff0c;发送方通过总线电平的变化&am…...

nuxt3中报错: `setInterval` should not be used on the server.

那是因为在后端渲染没有浏览器的执行环境&#xff0c;一些浏览器环境提供的对象和方法都无法使用&#xff0c;代码判断下就行。 if (import.meta.client) {setInterval(() > {}, 1000) }Import meta Nuxt API...

leetcode_深度搜索和广度搜索 101. 对称二叉树

101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称思路: 1.判断根节点的左右子树是否为空, 若都为空则返回True2.根节点的左右子树其中之一为空或子树的根节点的值不同则返回False3.分别判断根节点左右子树是否相同, 判断时, 左边子树的左节点要对应…...

QT修仙之路2-2 对话框 尚欠火候

警告对话框 相关代码 错误对话框 相关代码 消息对话框 相关代码 询问对话框 相关代码 相关代码 警告对话框 QMessageBox::warning(this,"错误","账号密码不能为空",QMessageBox::Ok);错误对话框 QMessageBox msgBox(QMessageBox::Critical,"错误…...