springboot redis 缓存入门与实战

Spring Boot3 Redis 项目地址

https://gitee.com/supervol/loong-springboot-study

(记得给个start,感谢)

Redis 介绍

        Redis 是一款高性能的 内存数据库(支持持久化),兼具缓存、NoSQL 存储、分布式锁等核心能力;Spring Boot 3 作为主流的 Java 开发框架,通过 spring-boot-starter-data-redis starter 简化了 Redis 的整合流程,降低了开发门槛。

Redis 核心

        开源内存数据库,支持 String、Hash、List、Set、ZSet 等数据结构,主打高性能(QPS 达 10W+)、低延迟,常用于缓存、分布式锁、会话存储等场景。Spring Boot 3 为 Redis 提供了两个核心操作类:RedisTemplate 和 StringRedisTemplate,两者定位不同,需根据场景选择。

1. StringRedisTemplate

  • 定位:专门处理 String 类型 的 Redis 操作(键和值均为 String)。
  • 默认配置:使用 StringRedisSerializer 序列化键和值,序列化后的数据在 Redis 中 可读性强(无乱码)。
  • 适用场景:存储简单字符串(如验证码、会话 ID、计数器等)。

2. RedisTemplate

  • 定位:通用 Redis 操作类,支持 任意类型 的键和值(通过泛型 RedisTemplate<K, V> 约束)。
  • 默认配置问题:默认使用 JdkSerializationRedisSerializer 序列化,会导致 Redis 中存储的是 二进制数据(可读性差,且需实体类实现 Serializable 接口),不推荐直接使用默认配置
  • 优化方案:自定义 RedisTemplate,使用 Jackson2JsonRedisSerializer 序列化(支持 JSON 格式,可读性强,无需实现 Serializable)。

Redis 示例

1. 前置条件

  • JDK 17+(推荐 JDK 17 或 21)
  • 构建工具:Maven 3.6+
  • 开发工具:IntelliJ IDEA
  • Redis 环境: Redis 6.x+       

2. 代码位置

        请参考项目地址中 springboot-cache/springboot-redis 模块代码。

Redis 高级

        Spring Boot 3 不仅支持 Redis 基础操作,还能便捷整合其高级特性(如缓存抽象、分布式锁、发布订阅)。基于 Redis 的缓存抽象,Spring 提供了 缓存注解(如 @Cacheable),结合 Redis 可快速实现缓存功能,无需手动调用 RedisTemplate

步骤 1:启用缓存

        在启动类上添加 @EnableCaching 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching // 启用 Spring 缓存抽象
public class RedisDemoApplication {public static void main(String[] args) {SpringApplication.run(RedisDemoApplication.class, args);}
}

步骤 2:使用缓存注解

        常用注解说明及示例:

注解作用
@Cacheable方法执行前先查缓存,有则返回缓存值;无则执行方法,将结果存入缓存。
@CachePut执行方法后,将结果存入缓存(覆盖旧值,常用于更新操作)。
@CacheEvict删除缓存(常用于删除操作,支持批量删除)。
@Caching组合多个缓存操作(如同时 @Cacheable 和 @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 UserService {/*** 查询用户:优先查缓存(key 为 "user:userId"),无则查数据库并缓存(1 小时过期)*/@Cacheable(value = "user", // 缓存名称(对应 Redis 中的 key 前缀:user::xxx)key = "#userId", // 缓存 key 的后缀(SpEL 表达式,#userId 为方法参数)unless = "#result == null", // 结果为 null 时不缓存timeout = 3600 // 缓存过期时间(秒))public User getUserById(Long userId) {// 模拟数据库查询(实际项目中替换为 MyBatis/JPA 调用)System.out.println("查询数据库:userId = " + userId);return new User(userId, "张三", 25, "zhangsan@xxx.com");}/*** 更新用户:执行方法后更新缓存(覆盖旧值)*/@CachePut(value = "user",key = "#user.id", // 用用户 ID 作为 keyunless = "#user == null")public User updateUser(User user) {// 模拟数据库更新System.out.println("更新数据库:user = " + user);return user;}/*** 删除用户:执行方法后删除缓存*/@CacheEvict(value = "user",key = "#userId")public void deleteUser(Long userId) {// 模拟数据库删除System.out.println("删除数据库:userId = " + userId);}
}

Redis 指南

1. 序列化方式选择

序列化器优点缺点推荐度
Jackson2JsonRedisSerializer可读性强、支持复杂对象、无需实现 Serializable需配置类型信息(避免反序列化丢失类型)★★★★★
StringRedisSerializer可读性强、轻量仅支持 String 类型★★★★☆
JdkSerializationRedisSerializer无需额外配置、支持所有实现 Serializable 的类可读性差(二进制)、需实现 Serializable★★☆☆☆

        结论:优先使用 Jackson2JsonRedisSerializer(自定义 RedisTemplate)。

2. 连接池配置优化

  • max-active:根据并发量调整(如 16-64,避免过大导致 Redis 压力)。
  • max-idle:建议与 max-active 一致(避免频繁创建连接)。
  • max-wait:设置为 1-3 秒(避免无限等待,快速失败)。
  • timeout:设置为 1-3 秒(避免网络波动导致的长时间阻塞)。

3. 缓存问题解决方案

问题原因解决方案
缓存穿透请求不存在的 key,穿透缓存直击数据库1. 缓存空值(短期过期);2. 使用布隆过滤器
缓存击穿热点 key 过期,大量请求直击数据库1. 互斥锁(如 Redisson 锁);2. 热点 key 永不过期
缓存雪崩大量 key 同时过期,数据库压力骤增1. 过期时间加随机值(分散过期);2. 集群部署 Redis

4. 数据一致性保障

        缓存与数据库同步的核心原则:先更新数据库,后操作缓存(避免脏数据)。

  • 更新操作:更新数据库 → 删除缓存(推荐,避免更新缓存失败导致脏数据)。
  • 删除操作:删除数据库 → 删除缓存。

总结        

        Spring Boot 3 整合 Redis 简化了开发流程,通过 RedisTemplate/StringRedisTemplate 可快速操作 Redis 基础数据结构,结合 Spring 缓存抽象、Redisson 分布式锁等高级特性,能满足企业级应用的核心需求。实际开发中需注意序列化配置、连接池优化、缓存一致性等问题,确保系统高性能、高可用。Redis 的场景覆盖 缓存、分布式协调、计数、消息、排序 等多个领域,核心是利用其 高性能、多结构、原子性 的特性解决传统数据库或单体应用的痛点。实际使用时需根据业务需求选择合适的数据结构和命令,同时注意内存管理、持久化策略和高可用部署(如主从、集群)。

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

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

相关文章

Redis缓存三大经典问题:雪崩、穿透、击穿详解

在高并发系统中&#xff0c;Redis作为高性能的内存缓存数据库&#xff0c;缓存可能会引发一系列严重问题——缓存雪崩、缓存穿透、缓存击穿。一、缓存雪崩&#xff08;Cache Avalanche&#xff09;1. 什么是缓存雪崩&#xff1f;缓存雪崩是指大量缓存数据在同一时间集中失效&am…

后端Web实战-删除修改

目录 1.删除员工 1.1.1 需求 1.1.2 接口文档 1.1.3 思路分析 1.1.4 功能开发 1.1.4.1 Controller接收参数 1.1.4.2 Service 1.1.4.3 Mapper 1.1.5 功能测试 1.1.6 前后端联调 2.修改员工 2.1 查询回显 2.1.1 接口文档 2.1.2 实现思路 2.1.3 代码实现 2.1.4 方式…

VNC连接服务器实现远程桌面-针对官方给的链接已经失效问题

按照官方给的链接在安装包的时候找不到链接&#xff0c;原链接可能已经失效新链接# 下载 libjpeg-turbo 官方 debwget --no-proxy "https://sourceforge.net/projects/libjpeg-turbo/files/2.0.90%20(2.1%20beta1)/libjpeg-turbo-official_2.0.90_amd64.deb/download"…

Docker在Windows与Linux系统安装的一体化教学设计

Docker跨平台安装实训课程设计 一、课程定位 本实训课程面向计算机应用技术、云计算技术与应用等专业学生&#xff0c;通过对比学习Docker在Windows和Linux两大主流操作系统上的安装与配置方法&#xff0c;帮助学生掌握容器化技术的基础环境搭建能力&#xff0c;为后续的容器管…

c++多线程(1)------创建和管理线程td::thread

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 std::thread 是 C11 标准库中用于创建和管理线程的核心类&#xff0c;定义在 头文件中。它使得多线程编程变得简单、类型安全且跨平台。 一、std::thread 简介 std::thread 是一个类…

Flutter环境搭建全攻略之-windows环境搭建

一&#xff0c;Flutter 官网&#xff1a;https://flutter.dev Flutter Packages官网&#xff1a;https://pub.dev 二&#xff0c;Windows 上面搭建Flutter Android运行环境 对应软件可以联系客服&#xff0c;或者网盘里面下载 1&#xff0c;Flutter Android环境搭建&#xff1a…

《Docker 零基础入门到实战:容器化部署如此简单,运维效率直接拉满》

相信你对封面图上的「Docker 鲸鱼」图标并不陌生 —— 它正是解决「开发环境能跑&#xff0c;生产环境崩了」的容器化神器&#xff01;Docker 通过打包应用与依赖到轻量容器&#xff0c;实现了「一次构建&#xff0c;到处运行」&#xff0c;彻底消除环境不一致的痛点。本文从 D…

Spring Security 深度学习(六): RESTful API 安全与 JWT

目录 1. 引言&#xff1a;无状态认证的崛起2. JWT (JSON Web Token) 核心概念2.1 什么是JWT&#xff1f;2.2 JWT的组成&#xff1a;Header, Payload, Signature2.3 JWT的工作原理2.4 JWT的优缺点与适用场景 3. Spring Security中的JWT集成策略3.1 禁用Session管理与CSRF防护3.2…

无名信号量

include <myhead.h> oid *task( void *file_size)int file_size1*(int*)file_size;//打开源文件int fdopen("./hello",O_RDONLY);if(fd-1){perror("open error\n");return NULL;}//打开目标文件int fd1open("./world",O_WRONLY);if(fd1-1)…

免费CRM系统与Excel客户管理的区别

很多中小企业在客户管理初期&#xff0c;会选择使用Excel表格进行客户数据的整理与维护。但随着业务规模扩大&#xff0c;客户信息日益复杂&#xff0c;Excel逐渐暴露出诸多局限性。此时&#xff0c;免费CRM系统应运而生&#xff0c;成为企业客户管理升级的重要选择。本文将深入…

linux Nginx服务配置介绍,和配置流程

1、Nginx 配置介绍认识Nginx服务的主配置文件 nginx.confnginx的配置文件一般在 /usr/local/nginx/conf/下&#xff0c;然后直接vim nginx.com 即可编辑1.1 全局配置介绍全局配置位于主配置文件最顶部&#xff0c;作用于整个Nginx服务进程&#xff0c;影响服务的资源分配、运行…

文字识别接口-文字识别技术-ocr api

文字识别接口&#xff0c;顾名思义&#xff0c;就是一种将图像文字或手写文字转换为可编辑文本的技术。文字识别接口&#xff0c;基于深度学习算法与自主ocr核心实现多种场景字符的高精度识别与结构化信息提取&#xff0c;现已被广泛应用于银行、医疗、财会、教育等多个领域。随…

DeepSeek R1大模型微调实战-llama-factory的模型下载与训练

文章目录概要1.下载模型2.llama factory 训练模型2.1 模型微调2.2 模型评估2.3 模型对话2.4 导出模型3.硬件选择概要 LLaMA Factory 是一个简单易用且高效的大型语言模型训练与微调平台。通过它&#xff0c;用户可以在无需编写任何代码的前提下&#xff0c;在本地完成上百种预…

C++ map和set

C参考文献&#xff1a;cplusplus.com - The C Resources Network 目录 一、序列式容器和关联式容器 二、set系列 &#xff08;1&#xff09;set类的介绍 &#xff08;2&#xff09;set的构造和迭代器 &#xff08;3&#xff09;set的接口 1.insert​编辑 2.find和erase 3…

头一次见问这么多kafka的问题

分享一篇粉丝朋友整理的面经&#xff0c;第一次遇见问那么多kafka的问题&#xff0c;看看他是怎么回答的。 先来看看 职位描述&#xff1a; 岗位职责&#xff1a; 负责基于 Go 的后端服务的设计、开发和维护&#xff1b;参与系统架构设计&#xff0c;确保系统的高可用性、高性能…

自底向上了解CPU的运算

文章目录 引言 CPU如何实现逻辑运算 NMOS和PMOS 基于MOS管组合下的逻辑门运算 逻辑运算下运算的实现 ALU的诞生 CPU的诞生 关于二进制运算的研究 十进制转二进制基础换算 为什么负数要使用补码进行表示 为什么反码就能解决正负数相加问题,我们还需要用补码来表示负数呢? 小数…

apache poi与Office Open XML关系

以下内容来自AI https://ecma-international.org/publications-and-standards/standards/ecma-376/ 官方规范 https://poi.apache.org/components/oxml4j/index.html java中针对Office Open XML的实现 Apache poi中各个组件 https://poi.apache.org/components/index.html …

S32K328上芯片内部RTC的使用和唤醒配置

1&#xff1a;RTC介绍 1.1 RTC基础功能介绍 参考《S32K3xx Reference Manual》&#xff0c;S32K328芯片内部自带RTC功能&#xff0c;并且支持从低功耗状态下唤醒设备&#xff1b;1.2 RTC电源介绍 由以下三张图可知 1&#xff1a;RTC由V11供电&#xff0c;V11依赖外部V15供电&am…

【Python】数据可视化之分类图

目录 条形图 箱形图 散点图 分簇散点图 小提琴 分簇小提琴 条形图 条形图是一种直观的图表形式&#xff0c;它通过不同长度的矩形条&#xff08;即“条形”&#xff09;来展示数值变量的中心趋势估计值&#xff0c;其中每个矩形的高度直接对应于该组数据的某个中心量度&…

RabbitMQ模型详解与常见问题

项目demo地址&#xff1a;https://github.com/tian-qingzhao/rabbitmq-demo 一、RabbitMQ组件概念 1.1 Server&#xff1a;接收客户端的连接&#xff0c;实现AMQP实体服务。 1.2 Connection&#xff1a;连接 应用程序与Server的网络连接&#xff0c;TCP连接。 1.3 Channel&…