2016-08-29 3 views
0

Когда я использую spring-data-redis, это касается двух проблем.spring-data-redis с cacheManager

Первая проблема, когда я использую кэш 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, как потоки:

@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 все Пользователи ~, но я также не могу получить значение с помощью этого ключа, как я могу получить значение с помощью redisTemplate и почему ключ является ключом allUsers ~ в redis.

Вторая проблема заключается в том, что я установил ключевой вызов «mykey» по Commond и установил значение «mykey», и я также не могу получить значение null с помощью java-кода, я могу получить значение через commond. Как так? Если две проблемы одинаковы? Кто-нибудь знает об этом? Спасибо заранее. ^.

обновление мой код версии: весна 4.1.6,
весна-данных Redis 1.7.0,
Jedis 2.8.1
Redis 3.2.3

ответ

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()); 
Смежные вопросы