更新于2019年11/08:
首先, 多谢CHENFU_ZKK同学指出我的错误.
卧槽,吓我一跳,我还以为我以前学的搞错了。若不是我亲自测试一遍,差点信你了 |
这两天趁有空, 跟踪了@Cacheable相关的源码再次确认结果如下:
1) 直接使用Spring的@Cacheable注解, 则调用的redis的set函数, 那么生成的Key为value和name俩个字符串通过::进行连接. 如文章中的案例, 结果为testcache::#userName.
2) 之所以我的系统上测试结果是上面文章的结果, 是因为我的系统自定义了redis的相关函数.
--------------------------2019-07-31 00:08:27发表的原文-------------------------------------------------------------
关于@Cacheable, 网上很多解释, 具体参考下面FYI:
我这里主要记录一下我自己在整合@Cacheable与Redis的理解.
1) @Cacheable与redis整合时, 使用的是redis的hset数据类型.
@Cacheable的语法:
@Cacheable(value=”testcache”,key=”#userName”)
redis命令行客户端使用hset的语法是:
hset key field value
2) @Cacheable的value参数实际上就是hset命令的key字段, 而@Cacheable的key参数是hset的field字段,
最后@Cacheable注解所在的函数返回值是hset命令的value字段.
----------------------------------------------------------------------------------------------------------
FYI:
如下摘自: https://blog.csdn.net/dreamhai/article/details/80642010:
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。 @Cacheable可以指定三个属性,value、key和condition。
|
参数 | 解释 | example |
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | 例如:@Cacheable(value=”mycache”) @Cacheable(value={”cache1”,”cache2”} |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写, 如果不指定,则缺省按照方法的所有参数进行组合 | @Cacheable(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写, 返回 true 或者 false,只有为 true 才进行缓存 | @Cacheable(value=”testcache”,condition=”#userName.length()>2”) |