spring集成redis做缓存@cacheable(value="cacheName",key="

2019-01-02 20:45发布

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相同的不同业务实体?

2条回答
还给你的自由
2楼-- · 2019-01-02 21:34

我的理解是,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'")

查看更多
ら面具成の殇う
3楼-- · 2019-01-02 21:49

搞明白了,原来还有一个#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”的缓存;

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

查看更多
登录 后发表回答