[英]Spring Redis issue: GetAllCacheNames from redis cache is not working with RedisCacheManager
[英]How does RedisCacheManager and Redis manage cache names?
Redis 如何管理屬於 Spring Framework 的org.springframework.cache.CacheManager
接口中的getCache("name")
方法使用的緩存名稱?
我在這里做了一些測試,無法得出任何結論,也沒有找到任何文件來澄清我的問題。
我有一個簡單的 Spring 啟動應用程序,它連接到 Redis 並發出一些命令。
Redis配置:
@EnableCaching
@Configuration
public class RedisCacheConfig {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
return (builder) -> {
Map<String, RedisCacheConfiguration> config = new HashMap<>();
RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(storage.getTtl()))
.disableCachingNullValues();
cacheConfig.usePrefix();
config.put("channel", cacheConfig);
builder.withInitialCacheConfigurations(config);
};
}
}
測試用例:
@SpringBootTest
@ExtendWith(SpringExtension.class)
public class RedisCacheServiceIT {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private RedisCacheManager cacheManager;
@Test
void testCache() {
var cache = cacheManager.getCache("cache1");
cache.put("key1", "value1");
cache.put("key2", "value2");
var cachedVal = cache.get("key1", String.class);
assertEquals("value1", cachedVal);
cache = cacheManager.getCache("channel");
cache.put("xyz", "123");
cachedVal = cache.get("xyz", String.class);
assertEquals("123", cachedVal);
redisTemplate.opsForValue().set("my_cache::xpto", "1234");
}
@Test
void testCacheNames() {
var names = cacheManager.getCacheNames();
names.forEach(n -> System.out.println("cache: " + n));
}
}
上面的測試將打印以下行:
即使我手動刪除 Redis 上的所有鍵,下次我只運行測試用例testCacheNames()
而不向緩存添加任何鍵時,它也會打印相同的緩存名稱。
Redis 在哪里存儲這些緩存名稱? 我找不到使用 Redis 客戶端(即 RedisInsight)。
還有為什么“my_cache”也沒有被列為緩存名稱?
我知道了。 我太天真了。。對不起。 但我必須回答我自己的問題。 spring-boot-starter-data-redis
將在 memory 中保留RedisCacheManagerBuilderCustomizer
Bean 配置中配置的所有緩存(參見方法redisCacheManagerBuilderCustomizer()
)。 而且每次代碼調用cacheManager.getCache(name)
時,它也會存儲在 memory 中。所以每當我調用cacheManager.getCacheNames()
時,它都會返回所有添加到它的緩存。 我雖然是從 Redis 服務獲取這些數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.