spring-data-redis with cacheManager



当我使用spring-data-redis时,它跨越了两个问题。

第一个问题是当我使用缓存annation加载数据到redis,但我不能通过redisTemplate获得值,代码如下:

@Bean
RedisTemplate<Object, Object> redisTemplate() {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
    redisTemplate.setConnectionFactory(jedisConnectionFactory());
    return redisTemplate;
}
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
    JedisConnectionFactory factory = new JedisConnectionFactory();
    factory.setHostName("localhost");
    factory.setPort(6379);
    factory.setUsePool(true);
    return factory;
}
@Bean
CacheManager cacheManager() {
    RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate());
    cacheManager.setDefaultExpiration(86400);
    return cacheManager;
}

UserService as flows:

@Cacheable("allUsers")
public List<UserModel> getAllUsers() {
    logger.info("execute getAllUsers!");
    return Arrays.asList(new UserModel("jason"), new UserModel("david"));
}
我的测试代码是:
@Test
public void testCache() {
    redisTemplate.delete("allUsers");
    userService.getAllUsers();  // load user data
    List<Object> users = redisTemplate.opsForList().range("allUsers", 0, -1); // get allUsers from redis
    logger.info("get from template");
    for(Object user : users) {
        logger.info(((UserModel)user).getUsername());
    }
    logger.info("get from service");
    for(UserModel user : userService.getAllUsers()) {
        logger.info(user.getUsername());
    }

和,我发现缓存"allUsers"在redis是allUsers~keys,但我也不能通过这个键获得值,我怎么能通过redisTemplate获得值,为什么键是allUsers~keys在redis。

第二个问题是我通过命令设置了一个键调用"mykey",并设置了值"mykey",我也不能通过java代码获得空值,我可以通过命令获得值。这是怎么回事?如果这两个问题是同一个问题呢?有人知道这些吗?提前谢谢你。^ .

更新我的代码版本是:春天4.1.6,
spring-data-redis 1.7.0,
能2.8.1发布
复述,3.2.3

初始化RedisTemplate而不初始化RedisSerializer时,模板默认使用JdkSerializationRedisSerializer。因此,生成的键将不是普通的String值,而是xacxedx00x05tx00x0bcache-key-1之类的值。

您可以使用StringRedisSerializer作为keySerializer来拥有普通的String密钥。

RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setKeySerializer(new StringRedisSerializer());

最新更新