编程语言
首页 > 编程语言> > java-多个键之一上的缓存逐出

java-多个键之一上的缓存逐出

作者:互联网

在我的应用程序中,我有多个具有多个键的可缓存方法:

@Cacheable(cacheNames = "valueCodes", key = "{#value, #fieldId, #projectId}")
@Cacheable(cacheNames = "fieldNames", key = "{#field, #value, #projectId}")
@Cacheable(cacheNames = "qi", key = "{#langCode, #question, #projectId}")
@Cacheable(cacheNames = "fieldCodes", key = "{#name, #projectId}")

现在,我需要一个cachevict方法,该方法将清除仅#projectId项(即UUID)与之匹配的所有缓存:

@CacheEvict(value = {"valueCodes", "fieldCodes", "qi"; "fieldCodes"}, key = "#projectId")

我已经读过this文章,这是不可能的,并且

Only the evict annotation’s key regex matching more than one element
in each of the cacheNames

我不太确定这是什么意思,但是我想这与SpEL中使用正则表达式有关.

因此,我开始考虑将密钥简化为一个密钥:

@Cacheable(cacheNames="cahceName", key="concat(#projectId).concat(#otherKey)")

并使用正则表达式将所有键与projectId匹配,后跟通配符.但是我真的找不到办法.

我要完成的目标有可能吗?如果是这样,我该怎么做?

解决方法:

Is what I’m trying to accomplish possible? If so, how do I do this?

您无法做任何事情.

通常,缓存的行为类似于哈希表,您只能对唯一键进行操作.选择属于项目ID的所有内容都需要在缓存中使用索引和查询机制.有些缓存具有该功能,但不是全部,并且没有通用的标准来实现.

仔细检查是否单独缓存属于项目的所有位是否真的有意义.如果所有东西都需要一起驱逐,也许可以一直使用.或者,例如,将ConcurrentHashMap保留为缓存中的值,该缓存中包含属于项目的各种组件.

有关此的更多信息,请参见问题:What is the better option for a multi-level, in-process cache?

删除注释并直接使用缓存可能是有意义的.带注释的选项是有限的.

标签:caching,spring-el,spring,java,evict
来源: https://codeday.me/bug/20191112/2023720.html