讲师中心 微信公众号
AI工具推荐 视频效率加速

Spring Boot集成Redis后如何解决脏读问题?

落墨君_1789

落墨君_1789

发布时间:2026-08-17 09:07:18

|

409人浏览过

|

来源于php中文网

原创

@Cacheable 不防脏读,因其仅执行“查缓存→查DB→写缓存”三步非原子操作,不加锁、不校验版本、不感知并发更新,导致旧值覆盖新数据。

spring boot集成redis后如何解决脏读问题?

Spring Boot集成Redis后,脏读问题无法靠单一注解或配置自动解决,必须结合业务场景主动控制读写时序和并发访问。

为什么 @Cacheable 本身不防脏读

@Cacheable 只负责“缓存有就返回、没就查库再存”,它不感知数据库是否正在被其他线程修改,也不加锁、不校验版本。当一个线程刚查完DB、还没写入缓存时,另一个线程已更新DB并删了缓存,此时第一个线程把旧值写进缓存,就形成脏数据。

常见错误现象:Cacheable 方法返回过期数据,但数据库里已是新值;多次刷新接口看到数据来回跳变。

  • 它不提供原子性:查DB → 写缓存 是两步,中间可能被插入更新
  • 它不处理并发:多个请求同时触发未命中,可能各自查到不同版本的DB数据
  • 它不带条件写入:缓存覆盖无前提校验,比如“仅当DB中version=5时才允许写入缓存”这类逻辑需手动编码

用 CacheEvict + 条件删除防缓存污染

当业务修改数据(如 updateUser())时,不能只依赖 @CacheEvict 简单删 key,要确保删得及时、删得准确。

推荐做法:

Spring Boot Actuator Analyzer
Spring Boot Actuator Analyzer

分析Spring Boot Actuator端点的安全性、健康检查、指标暴露及生产配置——审计信息、健康状态和自定义端点。

下载
  • 在更新数据库成功后立即执行 @CacheEvict(key = "#user.id", cacheNames = "users"),而不是在事务开始前删
  • 如果更新涉及多级缓存(如用户 + 用户权限 + 用户统计),用 @Caching(evict = {...}) 批量清除
  • 避免使用 allEntries = true,除非你确定当前缓存名下所有条目都该失效——否则会误伤其他用户的热点数据
  • 若更新失败回滚,@CacheEvict 不会自动撤销(因为它是基于方法执行结果触发的),所以必须保证 DB 更新成功是缓存失效的前提

用 Redis 事务 or Lua 脚本保读写原子性

当需要“读取 → 计算 → 写入”三步强一致时(比如库存扣减、余额变更),不能依赖 Spring Cache 抽象层,得下沉到 redisTemplate 或 stringRedisTemplate。

关键点:

  • WATCH + MULTI/EXEC 组合可防并发覆盖,但 Spring 的 redisTemplate.exec() 返回 null 表示事务被放弃,需手动重试
  • 更稳的方式是用 Lua 脚本:把判断和写入封装成一个原子操作,例如 EVAL "if redis.call('GET', KEYS[1]) >= tonumber(ARGV[1]) then redis.call('DECRBY', KEYS[1], ARGV[1]) return 1 else return 0 end" 1 stock 5
  • 注意:Lua 脚本内不能调用非确定性命令(如 TIME、RANDOMKEY),否则集群模式下会报错
  • 不要在脚本里做耗时计算,Redis 是单线程,脚本卡住等于整个实例卡住

延时双删不是银弹,得配监控和兜底

所谓“先删缓存 → 更新DB → 延时再删缓存”,本质是用时间换一致性,但这个“延时”很难精准设定。

实际落地要注意:

  • 延时值不能拍脑袋定,建议参考 DB 主从同步延迟 + 应用本地缓存刷新周期,一般设为 100–500ms
  • 必须配合监控:记录每次双删的耗时、二次删除是否成功(可用 redisTemplate.delete() 返回布尔值判断)
  • 要有兜底机制:比如给缓存加短 TTL(如 2s),即使双删失败,脏数据最多存活 2 秒
  • 该策略对“更新快、读多”的场景有效,但对“读写频率接近”的场景(如秒杀下单)依然可能漏掉,此时必须上分布式锁或 CAS

真正容易被忽略的是:所有这些手段都建立在「应用层能识别出哪些操作会引发脏读」的基础上。如果你连哪几个接口读、哪几个接口写、它们的 key 命名规则是否统一都说不清,加再多机制也白搭。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2611

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

477

2026.01.26

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4549

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4115

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

7672

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

643

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

756

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

7622

2024.04.07

剧云故事大纲与分场规划教程
剧云故事大纲与分场规划教程

本专题讲解剧云梗概与多级大纲功能,覆盖全局、分集、分场结构生成,以及主线冲突、剧情节点和场次顺序调整。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn