使用cacheManager进行spring-data-redis

时间:2016-08-29 13:24:53

标签: redis spring-cache spring-data-redis

当我使用spring-data-redis时,它遇到两个问题。

第一个问题是当我使用缓存设置将数据加载到redis时,但我无法通过redisTemplate获取值,代码为flow:

@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());
    }

并且,我发现redis中的缓存“allUsers”是allUsers~key,但我也无法通过此键获取值,如何通过redisTemplate获取值以及为什么键是redis中的allUsers~键。 / p>

第二个问题是我通过commond设置了一个键调用“mykey”,并设置了值“mykey”,而且我也无法通过java代码获取空值,我可以通过commond获得值。那个怎么样? 如果这两个问题是一样的吗? 有谁知道这些?谢谢你提前^。^。

更新我的代码版本是: 弹簧4.1.6,
spring-data-redis 1.7.0,
Jedis 2.8.1
redis 3.2.3

1 个答案:

答案 0 :(得分:0)

在没有RedisTemplate的情况下初始化RedisSerializer默认模板使用JdkSerializationRedisSerializer。因此,生成的密钥不是普通String值,而是\xac\xed\x00\x05t\x00\x0bcache-key-1

您可以使用StringRedisSerializer作为keySerializer使用普通String键。

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