簡體   English   中英

RedisCacheManager 和 Redis 是如何管理緩存名稱的?

[英]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));
    }
}

上面的測試將打印以下行:

  • 緩存:緩存1
  • 緩存:通道

即使我手動刪除 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM