首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在SpEL中使用自定义密钥测试Spring @Cacheable

在SpEL(Spring Expression Language)中使用自定义密钥测试Spring @Cacheable,可以通过以下步骤实现:

  1. 首先,确保你的项目中已经引入了Spring框架和相关的缓存依赖。
  2. 创建一个自定义的缓存密钥生成器(CacheKeyGenerator),用于生成自定义的缓存密钥。该密钥将用于标识缓存中的数据。
  3. 在自定义的缓存密钥生成器中,实现generateCacheKey方法,该方法接收SpEL表达式中的参数,并根据参数生成唯一的缓存密钥。
  4. 在SpEL表达式中使用自定义的缓存密钥生成器。可以通过在@Cacheable注解中使用SpEL表达式的方式,将自定义的缓存密钥生成器应用于缓存操作中。

下面是一个示例代码:

代码语言:txt
复制
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class CustomCacheKeyGenerator implements KeyGenerator {
    
    private ExpressionParser parser = new SpelExpressionParser();
    private Expression expression;
    
    public CustomCacheKeyGenerator(String spelExpression) {
        this.expression = parser.parseExpression(spelExpression);
    }
    
    @Override
    public Object generate(Object target, Method method, Object... params) {
        StandardEvaluationContext context = new StandardEvaluationContext();
        context.setVariable("params", params);
        return expression.getValue(context);
    }
}

在上述示例中,CustomCacheKeyGenerator类实现了KeyGenerator接口,并重写了generate方法。该方法使用SpEL表达式解析器解析传入的SpEL表达式,并通过EvaluationContext设置参数变量。最后,通过表达式的getValue方法获取生成的缓存密钥。

使用自定义的缓存密钥生成器,可以在@Cacheable注解中使用SpEL表达式,如下所示:

代码语言:txt
复制
@Cacheable(value = "myCache", keyGenerator = "customCacheKeyGenerator")
public Object myMethod(String param) {
    // 方法逻辑
}

在上述示例中,@Cacheable注解的value属性指定了缓存的名称,keyGenerator属性指定了使用的缓存密钥生成器。

请注意,这只是一个示例,你可以根据自己的需求进行修改和扩展。另外,对于Spring框架的缓存功能,推荐使用腾讯云的云缓存Redis产品(https://cloud.tencent.com/product/redis)来实现高性能的缓存存储和管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Spring注解式缓存

    目录 前言:spring+redis集成已完成的前提下​编辑Spring注解式缓存 1. spring注解式缓存使用步骤   1.1 配置缓存管理器    1.2 配置自定义Key生成器CacheKeyGenerator...根据用户ID或公司ID进行查询(此想法未测试) 前言:spring+redis集成已完成的前提下 Spring注解式缓存 Redis是key-value存储的非关系型数据库。...key,支持SpEL   2.2 @Cacheable       配置在方法或类上,作用:本方法执行后,先去缓存看有没有数据,如果没有,从数据库查找出来,给缓存存一份,返回结果,      ...="cacheName", key="#user.id)       public ResultDTO method(User user);       注1:以上三种配置方式使用spEL表达式...   避免使用耗时较长的操作命令,:keys *    Redis默认配置操作耗时超过10ms即视为慢查询       一个key对应的数据不应过大  对于string类型,一个key

    58120

    springboot cache 基本使用

    Springboot中会自动加载一个CacheManager(它有默认的实现类),所以只要写好一个自定义的Cache即可(如果想用系统定义好的或者第三方RedisCache也行,记得向Spring注册这个...bean即可) Cache和CacheManager是怎样做关联的,其实是Spring扫包实现的 凡是继承了Cache接口的类,都会被自动注入进CacheManager,最终存储于CacheManager...需通过condition缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存/清除缓存 例如:@Cacheable(value=”testcache...ctrl层Cacheable"); return cacheService.cacheableTest(); } } 根据属性自定义key //1.直接使用参数作为key @Cacheable...(value = "test",key = "#id") public Person cacheableTest(String id) {} //2.使用第一个参数作为key,SpEL表达式 @Cacheable

    54730

    cacheable更新_详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    spring 配置文件定义,必须指定至少一个 例如: @Cacheable(value=”mycache”) @Cacheable(value={”cache1”,”cache2”} key 缓存的...缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 @Cacheable(value=”testcache”,condition=”#userName.length...这里的缓存的 key 就是参数 userName,value 就是 Account 对象。“accountCache”缓存是在 spring*.xml 定义的名称。...比如之前的那个@Caching组合,会让方法上的注解显得整个代码比较乱,此时可以使用自定义注解把这些注解组合到一个注解: @Caching(put = { @CachePut(value =...上下文数据 Spring Cache提供了一些供我们使用SpEL上下文数据,下表直接摘自Spring官方文档: 名称 位置 描述 示例 methodName root对象 当前被调用的方法名 root.methodName

    3.8K20

    谈谈个人网站的建立(八)—— 缓存的使用

    MyBatis对二级缓存的设计非常灵活,它自己内部实现了一系列的Cache缓存实现类,并提供了各种缓存刷新策略LRU,FIFO等等;另外,MyBatis还允许用户自定义Cache接口实现,用户是需要实现...Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpELSpring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案...(value=”testcache”,key=”#userName”) condition 缓存的条件,可以为空,使用 SpEL 编写,只有为 true 才进行缓存 @Cacheable(value=”...”} key 缓存的key,可选,需要按照SpEL表达式填写 @Cacheable(value=”testcache”,key=”#userName”) condition 缓存的条件,可以为空,使用...KeyGenerator 在分布式系统,很容易存在不同类相同名字的方法,A.getAll(),B.getAll(),默认的key(getAll)都是一样的,会很容易产生问题,所以,需要自定义key来实现分布式环境下的不同

    1.5K60

    @Cacheablekey的SPEL表达式实现

    Spring的@Cacheable注解相信大家都有用过,其key属性是支持SPEL表达式的,像key="#root.args[0]"取到的就是方法第一个入参,这极大地简化了缓存key的配置。...上面提到的SPEL(Spring Expression language),是Spring3.0开始引入的Spring表达式语言,可以通过程序在运行期间执行的表达式将值装配到对象的属性或构造函数。...虽然@CachePram也支持了SPEL表达式,但在实现过程和使用上还是没有像@Cacheable的可以那样简单快捷。...在拦截器获取拦截方法入参的参数名称与参数值映射,然后通过解析spel表达式的key,获取真正存入缓存的key值。...@Cacheable的key那样,给自定义注解的key灵活设置SPEL表达式了。

    45510

    谈谈个人网站的建立(八)—— 缓存的使用

    MyBatis对二级缓存的设计非常灵活,它自己内部实现了一系列的Cache缓存实现类,并提供了各种缓存刷新策略LRU,FIFO等等;另外,MyBatis还允许用户自定义Cache接口实现,用户是需要实现...Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpELSpring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案...(value=”testcache”,key=”#userName”) condition 缓存的条件,可以为空,使用 SpEL 编写,只有为 true 才进行缓存 @Cacheable(value=”...”} key 缓存的key,可选,需要按照SpEL表达式填写 @Cacheable(value=”testcache”,key=”#userName”) condition 缓存的条件,可以为空,使用...KeyGenerator 在分布式系统,很容易存在不同类相同名字的方法,A.getAll(),B.getAll(),默认的key(getAll)都是一样的,会很容易产生问题,所以,需要自定义key来实现分布式环境下的不同

    1.4K50

    一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis

    key 和 condition * 支持 AspectJ,并通过其实现任何方法的缓存支持 支持自定义 key 和自定义缓存管理者,具有相当的灵活性和扩展性 使用前后 下面针对 SpringCache使用前后给出了伪代码部分...其中 # 号代表这是一个 SpEL表达式,此表达式可以遍历方法的参数对象,具体语法可以参考 Spring 的相关文档手册。...(根据方法的请求参数对其结果进行缓存) key: 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合(: @Cacheable(value="...user",key="#userName")) value: 缓存的名称,在 Spring 配置文件定义,必须指定至少一个(: @Cacheable(value="user") 或者@Cacheable...(value={"user1","use2"})) condition: 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存(: @Cacheable

    66810

    一起来学 SpringBoot 2.x | 第十篇:使用 Spring Cache 集成 Redis

    特点 具备相当的好的灵活性,不仅能够使用 SpELSpring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存例如...使用前后 下面针对Spring Cache使用前后给出了伪代码部分,具体也许比这要更加复杂,但是Spring Cache都可以很好的应对 使用前 我们需要硬编码,如果切换Cache Client还需要修改代码...(根据方法的请求参数对其结果进行缓存) key: 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合(:@Cacheable(value="user...",key="#userName")) value: 缓存的名称,在 Spring 配置文件定义,必须指定至少一个(:@Cacheable(value="user") 或者 @Cacheable(value...={"user1","use2"})) condition: 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存(:@Cacheable(value

    48810

    统一缓存帝国,实战 Spring Cache!

    2.3 测试缓存 那基础的配置已经做好了,现在就是看怎么使用 Spring Cache 了。...SpEL 表达式还有很多其它规则,如下所示: ? 可以根据项目需要选择合适的表达式来自定义 key。 2.6 自定义条件 除了设置缓存条目的 key,我们还可以自定义条件来决定是否将缓存功能关闭。...这里就要用到@Cacheable 另外两个属性:condition 和 unless,它俩的格式还是用 SpEL 表达式。对应的四个属性总结如下: ?...三、 总结 本文通过传统使用缓存的方式的痛点引出 Spring 框架的 Cache 组件。然后详细介绍了 Spring Cache 组件的用法: 五大注解。...@Cacheable、@CachePut、@CacheEvict、@Caching,、@CacheConfig。 如何自定义缓存条目的 key。 如何自定义 Cache 配置。

    43650

    6000 字 | 统一缓存帝国 - 实战 Spring Cache

    2.3 测试缓存 那基础的配置已经做好了,现在就是看怎么使用 Spring Cache 了。...2.4 自定义配置类 上面保存的缓存数据都是默认设置,我们也可以自己定义配置,如下所示,在配置文件 application.properties 添加如下配置: # 使用 Redis 作为缓存组件 spring.cache.type...SpEL 表达式还有很多其它规则,如下所示: 可以根据项目需要选择合适的表达式来自定义 key。 2.6 自定义条件 除了设置缓存条目的 key,我们还可以自定义条件来决定是否将缓存功能关闭。...这里就要用到@Cacheable 另外两个属性:condition 和 unless,它俩的格式还是用 SpEL 表达式。...@CacheEvict 还有些属性可供使用,总结如下: 三、 总结 本文通过传统使用缓存的方式的痛点引出 Spring 框架的 Cache 组件。

    24720

    SpringBoot缓存注解@Cacheable自定义key策略及缓存失效时间指定

    上一篇博文介绍了Spring缓存注解@Cacheable @CacheEvit @CachePut的基本使用,接下来我们将看一下更高级一点的知识点 key生成策略 超时时间指定 <!...扩展知识点 1. key生成策略 对于@Cacheable注解,有两个参数用于组装缓存的key cacheNames/value: 类似于缓存前缀 key: SpEL表达式,通常根据传参来生成最终的缓存...value,等号左边的为cacheName, 等号右边的为失效时间 要实现这个逻辑,可以扩展一个自定义的RedisCacheManager, public class TtlRedisCacheManager...小结 到此基本上将Spring缓存注解的常用姿势都介绍了一下,无论是几个注解的使用case,还是自定义的key策略,失效时间指定,单纯从使用的角度来看,基本能满足我们的日常需求场景 下面是针对缓存注解的一个知识点抽象...项目 系列博文 Spring系列缓存注解@Cacheable @CacheEvit @CachePut 使用姿势介绍 源码 工程:https://github.com/liuyueyi/spring-boot-demo

    1.3K20

    Spring cache 理解

    key 获取结果 参数 描述 示例 value 缓存的名称,在 spring 配置文件定义,必须指定至少一个 例如:@Cacheable(value=”usercache”) 或者 @Cacheable...=”usercache”,key=”#userName”) condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true才进行缓存 例如@Cacheable...不同的是 每次都会触发真实方法的调用 参数 描述 示例 value 缓存的名称,在 spring 配置文件定义,必须指定至少一个 例如:@Cacheable(value=”usercache”) 或者...用法是相同的,只是触发真实方法不同 ---- @CacheEvict 针对方法配置,能对缓存清空,也就是和redis 的 ddl 一样 参数 描述 示例 value 缓存的名称,在 spring 配置文件定义...,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如@Cacheable(value=”usercache”,condition=”#userName.length

    65220

    SpringBoot系列之缓存使用教程

    介绍SpringBoot项目中使用缓存,之前先介绍一下Spring的缓存抽象和JSR107,本博客是我在学习尚硅谷视频和参考其它博客之后做的笔记,仅供学习参考 文章目录 一、Spring的缓存抽象 1.1...三、Spring缓存使用 3.1、重要注解简介 例子实践之前,先简单介绍Spring提供的重要缓存注解 @Cacheable:针对方法配置,能够根据方法的请求参数对其结果进行缓存 @CacheEvict...condition:指定符合条件的情况下才缓存;使用SpEl表达式,eg:condition = “#a0>1”:第一个参数的值>1的时候才进行缓存 unless:否定缓存;当unless指定的条件为...this.employeeMapper.getEmpById(id); LOG.info("查询{}号员工数据",id); return employee; } 这里也可以使用自定义的...当然使用前面的Spring主键也是可以缓存的, ?

    82330

    SpringBoot缓存注解@Cacheable自定义key策略及缓存失效时间指定

    [logo.jpg] 上一篇博文介绍了Spring缓存注解@Cacheable @CacheEvit @CachePut的基本使用,接下来我们将看一下更高级一点的知识点 key生成策略 超时时间指定...扩展知识点 1. key生成策略 对于@Cacheable注解,有两个参数用于组装缓存的key cacheNames/value: 类似于缓存前缀 key: SpEL表达式,通常根据传参来生成最终的缓存...value,等号左边的为cacheName, 等号右边的为失效时间 要实现这个逻辑,可以扩展一个自定义的RedisCacheManager, public class TtlRedisCacheManager...小结 到此基本上将Spring缓存注解的常用姿势都介绍了一下,无论是几个注解的使用case,还是自定义的key策略,失效时间指定,单纯从使用的角度来看,基本能满足我们的日常需求场景 下面是针对缓存注解的一个知识点抽象...项目 系列博文 Spring系列缓存注解@Cacheable @CacheEvit @CachePut 使用姿势介绍 源码 工程:https://github.com/liuyueyi/spring-boot-demo

    7.9K00

    Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    这个案例包含了使用Spring Data JPA访问User数据的操作,利用这个基础,我们为其添加缓存,来减少对数据库的IO,以达到访问加速的作用。...如果是1.x版本,使用spring.jpa.properties.hibernate.show_sql=true参数。 修改单元测试类,插入User表一条用户名为AAA,年龄为10的数据。...@Autowired private CacheManager cacheManager; 使用debug模式运行单元测试,观察CacheManager的缓存集users以及其中的User对象的缓存加深理解...key值,若自己配置需使用SpEL表达式,比如:@Cacheable(key = "#p0"):使用函数第一个参数作为缓存的key值,更多关于SpEL表达式的详细内容可参考官方文档。...condition:缓存对象的条件,非必需,也需使用SpEL表达式,只有满足表达式条件的内容才会被缓存,比如:@Cacheable(key = "#p0", condition = "#p0.length

    57010

    Spring的Redis配置与使用

    注解 描述 @Cacheable 表明Spring在调用方法之前,首先应该在缓存查找方法的返回值,如果这个值能够找到,就会返回缓存的值。...否则,这个方法就会被调用,返回值会放到缓存之中 @CachePut 表名Spring应该将方法的返回值放到缓存。...在方法的调用前并不会检查缓存,方法始终都会被调用 @CacheEvict 表明Spring应该在缓存清除一个或多个条目 @Caching 这是一个分组的注解,能够同时应用多个其他的缓存注解 @Cacheable...key String SpEL表达式,用来计算自定义的缓存key unless String SpEL表达式,如果得到的值是true的话,返回值不会放到缓存之中 package springmvc.orders.db...和@CachePut需要非void的返回值,他将会作为放在缓存的条目 属性 类型 描述 value String[] 要使用的缓存名称 key String SpEL表达式,用来计算自定义的缓存key

    1.9K10

    Spring Boot---(14)Spring Boot 整合EhCache做缓存

    在这里@CacheConfig(cacheNames = "users"):配置了该数据访问对象返回的内容将存储于名为users的缓存对象,我们也可以不使用该注解,直接通过@Cacheable自己配置缓存集的名字来定义...由于Spring 4新增了@CacheConfig,因此在Spring 3原本必须有的value属性,也成为非必需项了 key:缓存对象存储在Map集合的key值,非必需,缺省按照函数的所有参数组合作为...key值,若自己配置需使用SpEL表达式,比如:@Cacheable(key = "#p0"):使用函数第一个参数作为缓存的key值,更多关于SpEL表达式的详细内容可参考官方文档 condition...:缓存对象的条件,非必需,也需使用SpEL表达式,只有满足表达式条件的内容才会被缓存,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3")...若需要指定一个自定义的key生成器,我们需要去实现org.springframework.cache.interceptor.KeyGenerator接口,并使用该参数来指定。

    1K30
    领券