高速公路建设网站创新的微商城网站建设

张小明 2026/1/16 23:42:03
高速公路建设网站,创新的微商城网站建设,数码产品网站开发背景,app如何推广一、 核心定义与作用 Spring Cache 不是一个具体的缓存实现#xff08;它不是 Redis#xff0c;也不是 EhCache#xff09;#xff0c;而是一套 缓存抽象层#xff08;Cache Abstraction#xff09;。 1. 核心定位 它类似于 JDBC 之于数据库。 JDBC 定义了标准接口#…一、 核心定义与作用Spring Cache不是一个具体的缓存实现它不是 Redis也不是 EhCache而是一套缓存抽象层Cache Abstraction。1. 核心定位它类似于 JDBC 之于数据库。JDBC定义了标准接口你可以底层换 MySQL 或 Oracle。Spring Cache定义了标准注解 (Cacheable)你可以底层换 Redis、Caffeine 或 ConcurrentMap而业务代码不需要修改一行。2. 核心价值代码解耦将业务逻辑Service与缓存技术细节分离。消除样板代码通过 AOP面向切面编程管理缓存不再需要手动编写redisTemplate.get/set。统一标准无论底层用什么上层注解用法一致。二、 核心注解体系Spring Cache 主要通过以下 5 个注解控制缓存行为注解核心作用执行逻辑 (通俗版)适用场景EnableCaching总开关开启 Spring 的缓存代理功能。启动类 / 配置类Cacheable查/存1. 先查缓存有则直接返回。2. 无则执行方法并将结果存入缓存。查询(Get)CachePut改/存始终执行方法并将返回值强制更新到缓存中。新增/修改(Save/Update)CacheEvict删执行方法前或后从缓存中删除指定数据。删除(Delete)Caching组合在一个方法上叠加多个操作如删 A 缓存同时删 B 缓存。复杂联动场景通用关键参数所有注解除开关外都支持以下参数value/cacheNames缓存名称对应 Redis 的 Key 前缀。key缓存 Key支持SpEL 表达式如#id,#user.name。condition事前判断。满足条件才处理缓存例如#id 10。unless事后判断。满足条件不缓存例如#result null。三、 实践案例详解以下模拟一个用户系统展示如何结合 Redis 使用。1. 查询缓存Cacheable需求查询用户缓存有直接返回无则查库并回填。同时防止缓存null值。ServicepublicclassUserService{AutowiredprivateUserMapperuserMapper;/** * value users: 对应 Redis 前缀 users:: (或自定义的 users:) * key #id: 取参数 id 作为后缀 * unless #result null: 如果查不到数据不要把 null 存进 Redis */Cacheable(valueusers,key#id,unless#result null)publicUsergetUserById(Longid){System.out.println(--- 走数据库查询 ---);returnuserMapper.selectById(id);}}2. 保持一致性CacheEvict 推荐需求修改用户信息后清理缓存保证下次查询获取最新数据。最佳实践优先使用删除模式 (Evict)而非更新模式 (Put)避免并发写导致脏数据。/** * 更新完成后删除对应的缓存 Key * key 必须与查询时的 key 生成规则一致 */CacheEvict(valueusers,key#user.id)publicvoidupdateUser(Useruser){userMapper.updateById(user);}/** * 场景删除用户或者清空整个缓存桶 * allEntries true: 删除 users 下的所有 key */CacheEvict(valueusers,allEntriestrue)publicvoidclearAllCache(){System.out.println(清空用户缓存);}3. 复杂 Key 生成 (SpEL)需求根据多个参数组合生成 Key。/** * 假设 typeVIP, page1 * Redis Key: user_list:VIP_1 */Cacheable(valueuser_list,key#type _ #page)publicListUsergetUsersByType(Stringtype,intpage){returnuserMapper.selectByType(type,page);}四、 避坑指南内部调用失效 (Self-Invocation)这是 Spring Cache 最经典的“大坑”。1. 现象描述在同一个 Service 类内部方法 A 调用带Cacheable的方法 B方法 B 的缓存注解失效每次都会执行 SQL。2. 原理图解Spring Cache 基于代理模式 (Proxy Pattern)。外部调用Controller - Proxy对象 - 拦截处理缓存 - 目标对象。内部调用this.method()是目标对象自己调用自己绕过了 Proxy 对象所以 AOP 切面无法执行。3. 代码示例与修复❌ 错误写法 (失效)ServicepublicclassUserService{// 方法 A批量查询publicListUsergetUsersByIds(ListLongids){ListUserusersnewArrayList();for(Longid:ids){// 【失效原因】这里等同于 this.getUserById(id)// 直接调用了类内部的方法没有经过 Spring 的代理类users.add(getUserById(id));}returnusers;}// 方法 B单查注解在此Cacheable(valueusers,key#id)publicUsergetUserById(Longid){System.out.println(查询数据库...);returnnewUser(id,name);}}✅ 修复方案 1自我注入 (简单有效)通过注入自身代理对象来调用强行经过代理层。ServicepublicclassUserService{// 1. 注入自己 (加上 Lazy 防止循环依赖报错)AutowiredLazyprivateUserServiceself;publicListUsergetUsersByIds(ListLongids){ListUserusersnewArrayList();for(Longid:ids){// 2. 【修复】使用代理对象 self 调用而不是 this// 流程self - Proxy - 检查缓存 - Targetusers.add(self.getUserById(id));}returnusers;}Cacheable(valueusers,key#id)publicUsergetUserById(Longid){// ...}}✅ 修复方案 2服务拆分 (架构更优)将缓存方法抽离到另一个 Service 中符合单一职责原则。// 新服务专门负责缓存操作ServicepublicclassUserCacheService{Cacheable(valueusers,key#id)publicUsergetUserById(Longid){...}}// 原服务注入上面的服务ServicepublicclassUserService{AutowiredprivateUserCacheServiceuserCacheService;publicListUsergetUsersByIds(ListLongids){// 外部调用缓存必然生效returnids.stream().map(userCacheService::getUserById).collect(Collectors.toList());}}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

阿里云网站空间主机地税城市维护建设税网站是什么

2025年科技股持续创纪录的同时,这些公司的高管们也在忙着将账面财富兑现为真金白银——根据彭博社对内部交易数据的分析,套现总额超过160亿美元。亚马逊创始人杰夫贝佐斯领跑这一趋势。他在6月和7月期间出售了2500万股股票,套现57亿美元&…

张小明 2026/1/9 15:00:21 网站建设

网站开发员工作职责广州大型网站设计公司

第一章:PHP跨域问题的本质解析在现代Web开发中,前端与后端常部署于不同域名下,导致浏览器基于安全策略实施同源限制。当使用JavaScript发起跨域请求时,若服务器未正确配置响应头,浏览器将阻止响应数据的访问&#xff0…

张小明 2026/1/9 15:00:19 网站建设

有关网站建设的参考书推广软件app

第一章:R语言论文绘图中线条的核心作用 在R语言的学术绘图中,线条不仅是连接数据点的视觉元素,更是传达趋势、对比差异和揭示模式的关键工具。恰当使用线条能够显著提升图表的信息密度与可读性,使读者快速捕捉研究结果的核心特征。…

张小明 2026/1/9 15:00:17 网站建设

中小网站建设都有哪些网站开发的教学视频教程

编程实现 WPF 应用程序 1. 引言 Microsoft 目前提供了两种创建桌面应用程序的方式:Windows Forms(自 .NET 1.0 起使用的技术)和 Windows Presentation Foundation(WPF,.NET 3.5 新增)。无论使用哪种技术,C# 语言基本保持不变。本文将重点介绍如何使用 C# 事件处理程序…

张小明 2026/1/9 15:00:16 网站建设

怎么建设音乐试听网站做旅行网站的依据及意义

在当今信息爆炸的时代,你是否经常遇到想要阅读的文章被付费墙挡住?无论是新闻网站的专业分析,还是技术博客的深度教程,付费墙已经成为获取优质内容的主要障碍。本文将为你详细介绍5种有效的数字内容访问方案,帮助你突破…

张小明 2026/1/13 1:34:28 网站建设

aspnet网站开发实例四大门户网站

工业控制面板中LCD接口技术实战:从原理到抗干扰优化在工厂车间的一角,一台PLC控制柜的显示屏突然开始闪烁,画面错位、颜色失真——这不是软件崩溃,而是LCD接口设计出了问题。对于嵌入式工程师来说,这并不罕见。工业现场…

张小明 2026/1/15 8:00:10 网站建设