首页 新闻 会员 周边

spring集成redis做缓存@cacheable(value="cacheName",key="#id"),id重复怎么破?

0
悬赏园豆:20 [已解决问题] 解决于 2018-11-19 16:55

spring集成redis做缓存的时候,
使用@cacheable(value="cacheName",key="#id")标注一个getUser(id)方法和getRole(id)方法,
想用id来作为缓存的key,但是id肯定有重复的情况;
我本来以为value属性就是用来区分不同业务对象的一个机制,
{
我本来的理解:
在getUser(id)方法上添加@cacheable(value="user",key="#id"),
在getRole(id)方法上添加@cacheable(value="role",key="#id"),
这样就可以将两个id一样的user和role给区分开了;
}
但是,调用getUser(11)后,调用getRole(11),从缓存里取到的居然是user!
可见,我本来的想法是错的!
那请教各位大神:
1、那个value到底用来干嘛的?
2、如果想用id来作为key,如何区分id相同的不同业务实体?

lrj1596的主页 lrj1596 | 初学一级 | 园豆:22
提问于:2018-11-19 12:46

个人理解:存在redis 里的是你的key 值,value 是存的值 ,你可以在key值加前缀

Joker_2 5年前
< >
分享
最佳答案
1

搞明白了,原来还有一个#root.caches元数据!!!
value属性,确实是指定了缓存的名称,但是并没有强行将value不同的缓存值加以区分(这个是有道理的,因为有些时候,需要把不同业务属性的实体存在一个缓存里,这种情况肯定是有的,所以如果强行通过value区分的话,上述需求反而实现不了了);
所以,spring的设计者是把——是否通过value区分的决定权——交给我们了,
如果要通过value区分,那就再手动用一下#root.caches,向spring表明,我们要用value所表示的缓存名来区分具体的缓存实体;
具体用法示例:
当方法的value属性进行了设置(如@Cacheable(value={"cache1", "cache2"})),则有两个cache;
此时可以使用@Cacheable(value={"cache1", "cache2"},key="#root.caches[0].name"),意思就是使用value为“cache1”的缓存;

还是非常感谢 面具灬 同学的帮助!分全给你了~~

lrj1596 | 初学一级 |园豆:22 | 2018-11-19 16:52
其他回答(2)
0

我的理解是,value 是你缓存的名称,key值是你缓存的这个对象的对应的签名, 具体你可以参考下https://blog.csdn.net/chenleixing/article/details/44815443
你用id来作为key的话,存user或role的拼接 ,你可以试试
@cacheable(value="name",key="#id+ 'user'")
@cacheable(value="name",key="#id+ 'role'")

收获园豆:20
画笔灬 | 园豆:920 (小虾三级) | 2018-11-19 15:10

那也就是说,这个value(缓存名称)其实在——区分不同业务实体的缓存——这个问题上,没什么用处咯?

支持(0) 反对(0) lrj1596 | 园豆:22 (初学一级) | 2018-11-19 15:20

@lrj1596: 大概是这个意思,value只是表示当前方法的返回值是会被缓存在哪个Cache上

支持(0) 反对(0) 画笔灬 | 园豆:920 (小虾三级) | 2018-11-19 15:23

@面具灬: 居然是这样...................真奇葩~~~~~~~~~~~~一般通常的认知,“名称”这个概念就是用来区分不同实体的,这里,居然不是....................

支持(0) 反对(0) lrj1596 | 园豆:22 (初学一级) | 2018-11-19 15:48
0

楼主解决该问题了吗 我看了看源码 貌似不设置setUsePrefix redis并没有区分开不同的缓存名称,是不是可以设置setUsePrefix(true) 实现楼主的需求

gavin峰 | 园豆:202 (菜鸟二级) | 2019-11-23 00:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册