如果存在密钥前缀,spring-data-redis cacheNames将不起作用

问题描述 投票:1回答:1

假设我具有以下方法的spring-data-redis应用程序:

@Cacheable(
    value = "cacheName",
    key = "T(java.lang.String).format('tiles:%s', #categories.hashCode())")
public List<Tile> findAll(Set<String> categories) {
    return findAllByCategories(categories);
}

这些条目按如下方式保存到Redis:

cacheName::tiles:253903999

现在我可以从另一种方法退出此缓存:

@CacheEvict(value = "cacheName", allEntries = true)
public Optional<Tile> save(Tile entity) {
    return super.save(entity);
}

一切都会按预期进行。

但是设置属性spring.cache.redis.key-prefix=prefix:在Redis中提供了以下条目:

prefix:tiles:253903999

由于没有关于cacheName的信息,因此现在无法逐出缓存。

为什么不创建以下条目:

cacheName::prefix:tiles:253903999

是否可以解决此问题?为什么spring-data-redis这样工作?

java spring redis spring-data-redis spring-cache
1个回答
0
投票

第一个问题很简单:它不应该创建您指定的条目,因为它不再是前缀。

当然,可以解决此问题。您也可以尝试以下操作:Spring Data Redis存储库为here,您应该可以轻松在其中找到贡献准则。

说到最后一个问题:之所以发生这种情况,是因为如何根据此属性计算要收回的密钥。该属性的前缀位于您在@Cacheable.key批注属性中指定的前缀之前,因此将要存储在Redis中的结果键对@Cacheable.value中设置的缓存名称一无所知。对于缓存驱逐,通配符模式(*)会以配置中指定的前缀为前缀。在您的示例中,要删除的密钥为:prefix:tiles:*

[我认为,如果将缓存名称附加到前缀上,就不会有问题(例如prefix:tiles:cacheName:253903999,其中prefix:tiles:是全局前缀,cacheName显然是缓存名称)。在此应用前缀:org.springframework.data.redis.cache.RedisCacheConfiguration#prefixKeysWith和要删除的密钥是使用以下函数计算的:org.springframework.data.redis.cache.RedisCacheConfiguration#getKeyPrefixFor

© www.soinside.com 2019 - 2024. All rights reserved.