2016-07-21 19 views
3

ich einen ttl für meine Schlüssel festlegen möchten, die in Redis gespeichert sind, und ich habe getan, dass in der folgenden Art und Weise:Spring Data RedisTemplate, ttl funktioniert nicht, wenn ein Wert Einstellung

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

Aber, wenn Ich drucke das TTL des erstellten Schlüssels, der gleich -1 ist.

Bitte sagen Sie mir, was ich falsch mache.

Die Vorlage Bohne wird in der folgenden Art und Weise konfiguriert:

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

Antwort

4

Sie benötigen expire(…) und set(…) in einer anderen Reihenfolge zu nennen. Der SET Befehl löscht jede Timeout, die zuvor angewandt wurden:

Aus der Dokumentation bei http://redis.io/commands/set:

Set-Taste des String-Wert zu halten. Wenn der Schlüssel bereits einen Wert enthält, wird er ungeachtet seines Typs überschrieben. Jede frühere Lebenszeit, die mit dem Schlüssel verknüpft ist, wird bei einer erfolgreichen SET-Operation verworfen.

In Ihrem Fall müssen Sie nur die Reihenfolge der expire(…) und set(…)-set(…) und expire(…) wechseln.

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

Außerdem könnten Sie den Code, indem Sie den Wert und Ablauf in einem Aufruf verbessern. ValueOperations (RedisOperations.opsForValue()) eine set Methode, die die Schlüssel und Timeout mit der Signatur

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

Danke für detaillierte Antwort setzt. –

0

Ich habe set() und die expire() Methoden ersetzen und es ist die Arbeit beginnen.

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