假设我具有以下方法的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
这样工作?
第一个问题很简单:它不应该创建您指定的条目,因为它不再是前缀。
当然,可以解决此问题。您也可以尝试以下操作: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
。