2016-08-29 2 views
0

Lorsque j'utilise spring-data-redis, il y a deux problèmes.spring-data-redis avec cacheManager

Le premier problème est quand j'utilise le cache annation pour charger des données à Redis, mais je ne peux pas obtenir la valeur par redisTemplate, le code comme flux:

@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 comme flux:

@Cacheable("allUsers") 
public List<UserModel> getAllUsers() { 
    logger.info("execute getAllUsers!"); 
    return Arrays.asList(new UserModel("jason"), new UserModel("david")); 
} 

mon code de test est:

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

et, j'ai trouvé le cache "AllUsers" dans Redis est tout Les utilisateurs ~ clés, mais je ne peux pas non plus obtenir de valeur par cette clé, comment puis-je obtenir la valeur par redisTemplate et pourquoi la clé est allUsers ~ clés en redis.

Le deuxième problème est que je mets un appel clé "mykey" par commond, et la valeur de réglage "mykey", et je ne peux pas obtenir la valeur nulle par le code java, je peux obtenir la valeur par commond. Comment c'est? Si les deux problèmes sont les mêmes? Quelqu'un sait-il cela? Merci avancez ^. ^.

mise à jour ma version de code est: printemps 4.1.6,
ressort données Redis 1.7.0,
Jedis 2.8.1
Redis 3.2.3

Répondre

0

Initialisation du RedisTemplate sans RedisSerializer par défaut le modèle pour utiliser le JdkSerializationRedisSerializer. Donc, la clé produite ne sera pas la valeur String, mais plutôt quelque chose comme \xac\xed\x00\x05t\x00\x0bcache-key-1.

Vous pouvez utiliser le StringRedisSerializer comme keySerializer pour avoir des clés String simples.

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