2016-07-21 2 views
3

내가 레디 스에 저장되어있는 열쇠의 TTL을 설정할 값을 설정할 때 TTL이 작동하지 않습니다, 나는했던 다음과 같은 방법으로 그 :봄 데이터 RedisTemplate,

@Component 
public class RedisBetgeniusMarketService implements BetgeniusMarketService { 

    private static final int DEFAULT_EVENTS_LIFE_TIME = 240; 

    @Value("${redis.events.lifetime}") 
    private long eventsLifeTime = DEFAULT_EVENTS_LIFE_TIME; 

    @Autowired 
    private RedisTemplate<String, Market> marketTemplate; 

    @Override 
    public Market findOne(Integer fixtureId, Long marketId) { 
     String key = buildKey(fixtureId, marketId); 
     return marketTemplate.boundValueOps(key).get(); 
    } 

    @Override 
    public void save(Integer fixtureId, Market market) { 
     String key = buildKey(fixtureId, market.getId()); 
     BoundValueOperations<String, Market> boundValueOperations = marketTemplate.boundValueOps(key); 
     boundValueOperations.expire(eventsLifeTime, TimeUnit.MINUTES); 
     boundValueOperations.set(market); 
    } 

    private String buildKey(Integer fixtureId, Long marketId) { 
     return "market:" + fixtureId + ":" + marketId; 
    } 
} 

그러나, 때 나는 생성 된 키의 ttl을 -1과 동일하게 인쇄하고 있습니다.

내가 뭘 잘못하고 있는지 말해주십시오.

템플릿 빈은 다음과 같은 방식으로 구성됩니다

@Bean 
    public RedisTemplate<String, com.egalacoral.spark.betsync.entity.Market> marketTemplate(RedisConnectionFactory connectionFactory) { 
     final RedisTemplate<String, com.egalacoral.spark.betsync.entity.Market> redisTemplate = new RedisTemplate<>(); 
     redisTemplate.setKeySerializer(new StringRedisSerializer()); 
     redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(com.egalacoral.spark.betsync.entity.Market.class)); 
     redisTemplate.setConnectionFactory(connectionFactory); 
     return redisTemplate; 
    } 

답변

4

당신은 다른 순서로 expire(…)set(…)를 호출해야합니다. http://redis.io/commands/set에서

문서에서 : :이 SET 명령은 이전에 적용된 모든 제한을 제거

설정 키를 문자열 값을 누릅니다. key가 벌써 값을 보관 유지하고있는 경우는, 그 타입에 관계없이 덧 쓰기됩니다. 키와 관련된 이전의 모든 시간은 성공적인 SET 조작시 v립니다. 귀하의 경우에는

당신은 set(…)expire(…)expire(…)set(…)의 순서를 전환 할 필요가있다.

@Override 
public void save(Integer fixtureId, Market market) { 
    String key = buildKey(fixtureId, market.getId()); 
    BoundValueOperations<String, Market> boundValueOperations = marketTemplate.boundValueOps(key); 

    boundValueOperations.set(market); 
    boundValueOperations.expire(eventsLifeTime, TimeUnit.MINUTES); 
} 

그 외에, 당신은 하나 개의 통화 가치와 만기를 설정하여 코드를 향상시킬 수 있습니다. ValueOperations (RedisOperations.opsForValue())의 상세한 답변은 서명

void set(K key, V value, long timeout, TimeUnit unit); 
+0

덕분 키 및 타임 아웃을 설정하는 set 방법을 제공한다. –

0

나는 set()expire() 방법을 교체해야하며 작업을 시작합니다.

@Override 
    public void save(Integer fixtureId, Market market) { 
     String key = buildKey(fixtureId, market.getId()); 
     BoundValueOperations<String, Market> boundValueOperations = marketTemplate.boundValueOps(key); 
     boundValueOperations.set(market); 
     boundValueOperations.expire(eventsLifeTime, TimeUnit.MINUTES); 
    }