2015-06-18 2 views
0

У меня есть следующие два определения бобов для Spring Data Redis. Я не могу найти соответствующую документацию для определения областей (singleton, request или session) этих компонентов для веб-приложения.Весенний бобы для StringRedisConnection

@Bean 
public StringRedisTemplate redisTemplate() throws Exception { 
    StringRedisTemplate redisTemplate = new StringRedisTemplate(); 
    redisTemplate.setConnectionFactory(jedisConnectionFactory()); 
    return redisTemplate; 
} 

@Bean 
public StringRedisConnection stringRedisConnection() throws Exception { 
    return new DefaultStringRedisConnection(redisTemplate().getConnectionFactory().getConnection()); 
} 
+0

если не смешаны с '@ Scope' те будут одиночек. Будет ли иметь смысл в вашем случае использовать «StringRedisTemplate», используя, например. 'jedisConnectionFactory' вместо' StringRedisConnection'? –

+0

Привет Крис - Я должен был использовать функцию zrangelex, доступную только из StringRedisConnection. https://jira.spring.io/browse/DATAREDIS-378. Чтобы уточнить, я спрашиваю, должен ли я инициализировать новый StringRedisConnection для каждого запроса/сеанса от пользователя или это прекрасно, если бы он был просто синглом. Спасибо –

+1

Я бы воспользовался 'RedisTemplate.execute' с' RedisCallback', поэтому вы можете выпустить 'zRangeByLex' оттуда и не беспокоиться о связности. Я также создал [DATAREDIS-407] (https://jira.spring.io/browse/DATAREDIS-407) для добавления команды в 'ZSetOperations', чтобы она была доступна через' RedisTemplate.opsForZSet'. –

ответ

0

Благодаря @Christoph Штробля рекомендации здесь является реализация И в настоящее время использует

public List<String> testAutoComplete(String key,String query, int limitCount){ 
     StringRedisSerializer serializer = new StringRedisSerializer(); 
     RedisZSetCommands.Range range = Range.range(); 
     range.gt(query); 
     RedisZSetCommands.Limit limit = new RedisZSetCommands.Limit(); 
     limit.count(limitCount); 
     return template.execute(new RedisCallback< List<String>>() { 
      public List<String> doInRedis(RedisConnection connection) { 
       Set<byte[]> results = connection.zRangeByLex(serializer.serialize(key), range,limit); 
       List<String> resultAsString = new ArrayList<String>(); 
       for(byte[] result : results){ 
        resultAsString.add(serializer.deserialize(result)); 
       } 
       return resultAsString; 
      } 
     },false); 
    } 
Смежные вопросы