【问题标题】:How are cache misses handled by spring-data-redis multiGet?spring-data-redis multiGet 如何处理缓存未命中?
【发布时间】:2020-02-10 21:44:54
【问题描述】:

我正在使用 Redis 缓存(通过 Jedis 客户端),我想使用 ValueOperations#multiGet,它接受 Collection 的键,并从缓存中返回 List 的对象,同样命令。我的问题是,当某些键在缓存中而其他键不在时会发生什么?我知道在下面使用了Redis MGET,它将为不在缓存中的任何元素返回nil

我找不到任何关于ValueOperations 将如何解释此响应的文档。我假设他们将是null,当然可以对其进行测试,但是围绕未记录的行为构建系统会很危险。

为了完整起见,这里是缓存客户端的配置方式:

@Bean
public RedisConnectionFactory redisConnectionFactory() {
    JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();

    redisConnectionFactory.setHostName(address);
    redisConnectionFactory.setPort(port);

    redisConnectionFactory.afterPropertiesSet();
    return redisConnectionFactory;
}

@Bean
public ValueOperations<String, Object> someRedisCache(RedisConnectionFactory cf) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(cf);
    redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
    redisTemplate.afterPropertiesSet();
    return redisTemplate.opsForValue();
}

我正在使用spring-data-redis:2.1.4

那么,有没有关于这方面的任何文档,或者一些可靠的事实来源?

【问题讨论】:

    标签: spring-boot redis spring-data jedis spring-data-redis


    【解决方案1】:

    经过一番摸索,看起来答案与使用的序列化程序有关 - 在本例中为 GenericJackson2JsonRedisSerializer。不想挖掘太多,我只是写了一个测试,验证 Redis 返回的任何(nil) 值都转换为null

    @Autowired
    ValueOperations<String, SomeObject> valueOperations
    
    @Test
    void multiGet() {
        //Given
        SomeObject someObject = SomeObject
                .builder()
                .contentId("key1")
                .build()
        valueOperations.set("key1", someObject)
    
        //When
        List<SomeObject> someObjects = valueOperations.multiGet(Arrays.asList("key1", "nonexisting"))
    
        //Then
        assertEquals(2, someObjects.size())
        assertEquals(someObject, someObjects.get(0))
        assertEquals(null, someObjects.get(1))
    }
    

    所以,在 Redis 中,这是:

    127.0.0.1:6379> MGET "\"key1\"" "\"nonexisting\""
    1) "{\"@class\":\"some.package.SomeObject\",\"contentId\":\"key1\"}"
    2) (nil)
    

    将产生List{SomeObject, null}

    【讨论】:

    • 您好!所以你的意思是说,redis 缓存为不存在的键返回 null 已经是内置的。我们不必担心,我们可以检查它是否为空。
    猜你喜欢
    • 2017-11-01
    • 2016-02-12
    • 2018-11-29
    • 2022-08-03
    • 2016-06-18
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多