jetcache icon indicating copy to clipboard operation
jetcache copied to clipboard

多个@Cached的name相同时候,redis缓存的key的超时时间都会是第一次执行的那个expire值

Open houston9571 opened this issue 1 year ago • 4 comments

多个@Cached的name相同时候,所有该方法的expire时间都会是第一次执行的那个值,如:

  1. @Cached(name = "UserEntity:", key = "'findAllCache'", cacheType = CacheType.BOTH, expire = 1800)
  2. @Cached(name = "UserEntity:", key = "#id", cacheType = CacheType.BOTH, expire = 3600) 如果先执行方法1,然后执行方法2,则redis中缓存的两个key(UserEntity:findAllCache UserEntity:5")的超时时间都是1800, 如果先执行方法2,然后执行方法1,则redis中缓存的两个key的超时时间就会都是3600,按道理应该是互不干涉的,因为redis的key是注解中的name+key。 请验证并解惑一下,这个是否是设计的bug还是我测试的不对?多谢

houston9571 avatar May 12 '23 04:05 houston9571

不同的Cache你应该用不同的name。

使用Cached注解,相同的area和name,会生成同一个Cache实例,这个Cache实例具有相同的设置(包括默认超时时间),按哪个注解的指示来初始化这个Cache实例是不确定的。

如果你使用api,同一个Cache实例做put操作的时候,也可以指定不同的超时时间。

areyouok avatar May 15 '23 05:05 areyouok

可是我对于user来说,一系列的缓存redis key都是user:开头的,区别在于key里的值,通常name的值是定义一个常量的,area没有 用到这么细分的地步吧?通常指定一个域,我不知道大家是不是实际使用中每个name都定义不相同,这样很麻烦,失去key这个属性的意义了

houston9571 avatar May 15 '23 08:05 houston9571

你没有理解area的意思,它是最大的分类,一般来说你不用改。

从你给的例子看,一个是集合列表的缓存,一个是单个记录的缓存,如果你用注解就该用不同的name。

两个Cached注解通常不应该使用相同的name,否则,如果你需要把cacheType改成REMOTE,你知道该改哪个吗?Cached指定的name通常是给CacheInvalidate/CacheUpdate注解引用的。

areyouok avatar May 15 '23 08:05 areyouok

area+name+key,这样组成缓存的键值,但是不同的key不能定义不同的超时时间,我认识是一个bug或者设计缺陷,这是我的观念。至于你说的什么实现原理或者应该不同cache使用不同name,那是实现和使用场景,别跑题。 但是实际使用中,key就是个变量,有可能这个name缓存加上key之后,是缓存的分页数据列表, 有可能是单个对象,我为什么要用不同的nane?我不能用key里的变量值来区分吗?这个时候超时时间为什么必须一样?这难道还不是问题?

houston9571 avatar Jun 03 '23 02:06 houston9571