Spring-data-redis с cacheManager

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

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

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

обновить версию моего кода: spring 4.1.6,
spring-data-redis 1.7.0,
Jedis 2.8.1
redis 3.2.3


person web david    schedule 29.08.2016    source источник


Ответы (1)


При инициализации 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());
person Christoph Strobl    schedule 31.08.2016