@Cacheable 简单使用

本文详细介绍了Spring Cache中的@Cacheable注解,用于将方法返回结果缓存,提升应用程序性能。当指定方法被调用时,如果缓存中存在相同key的值,则直接从缓存返回,避免重复计算。示例展示了如何配置key和unless属性,并给出了清除特定缓存的代码示例。

介绍

@Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。
使用方法
@Cacheable(value = CacheConstants.USER_INFO, key = “#userId”, unless = “#result == null”)

存入redis中的key是 value+key 按上图写法就是 CacheConstants.USER_INFO+userId 作为key值

通过redis命令行 get Key值可以查到相关数据

展示的redis数据格式可能需要转换下 这里可以优化
在这里插入图片描述

清除缓存代码

private final CacheManager cacheManager;

cacheManager.getCache(CacheConstants.USER_DETAILS).evict(sysUser.getPhone());

参考链接

spring cache 学习 —— @Cacheable 使用详解

Spring 中,`@Cacheable` 是一个非常重要的注解,用于简化缓存逻辑的实现。它允许开发者将方法调用的结果缓存起来,从而避免重复计算或频繁访问数据库等操作,提高应用程序性能。 ### 基本使用方法 `@Cacheable` 注解通常作用于服务层的方法上,表示该方法的结果可以被缓存。当方法被调用时,Spring 会首先检查缓存中是否存在对应的数据。如果存在,则直接返回缓存中的数据;如果不存在,则执行方法并将结果存储到缓存中 [^2]。 #### 核心属性 - **value/cacheNames**:指定缓存的名称,必须设置。可以通过配置文件定义多个缓存区域。 - **key**:指定缓存的键值,默认情况下,Spring 使用方法参数作为键。可以使用 SpEL(Spring Expression Language)来定制键。 - **condition**:指定条件表达式,只有满足条件时才会启用缓存。 - **unless**:与 `condition` 类似,但用于排除某些情况。 #### 示例代码 以下是一个使用 `@Cacheable` 的简单示例: ```java import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class CacheService { // 缓存名称为 "userCache",键为方法参数 id @Cacheable(value = "userCache", key = "#id") public String getUserById(String id) { System.out.println("Fetching user for ID: " + id); // 模拟耗时操作,例如数据库查询 return "User_" + id; } } ``` 在这个例子中,第一次调用 `getUserById("123")` 时,会打印日志并返回结果。后续再次调用相同的参数时,不会打印日志,而是直接从缓存中获取结果。 ### 配置缓存管理器 为了使 `@Cacheable` 生效,需要配置一个缓存管理器(`CacheManager`)。Spring 支持多种缓存实现,如 `ConcurrentMapCacheManager`、`EhCache`、`Redis` 等。以下是基于内存缓存的简单配置示例: ```java import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.concurrent.ConcurrentMapCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager("userCache"); } } ``` 上述代码中,`@EnableCaching` 启用了 Spring 的缓存支持,而 `ConcurrentMapCacheManager` 提供了一个简单的内存缓存实现。 ### 自定义缓存管理器 如果默认的缓存实现无法满足需求,可以通过实现 `org.springframework.cache.CacheManager` 接口来自定义缓存管理器。例如,集成 Redis 缓存时,可以使用 `RedisCacheManager` 来替代默认的缓存管理器。 ### SpEL 表达式示例 除了基本的键生成方式,还可以通过 SpEL 定制更复杂的键。例如,以下代码展示了如何根据方法参数和返回值生成键: ```java @Cacheable(value = "productCache", key = "#root.methodName + #id") public Product getProductById(String id) { // 查询数据库 return productRepository.findById(id); } ``` 在此示例中,缓存的键由方法名和参数 `id` 组成。 ### 注意事项 - 确保缓存的键是唯一的,并且能够准确标识缓存数据。 - 对于需要更新缓存的情况,可以结合 `@CachePut` 和 `@CacheEvict` 注解进行处理。 - 如果缓存数据敏感,应考虑安全性问题,例如设置过期时间或限制访问权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值