2017-06-09 1 views
1

Ich versuche Redis/Jedis mit Frühling zu verstehen. Ich stecke irgendwo fest, wo ich nach einiger Zeit meinen Schlüssel nicht auslaufen lassen kann.Jedis Schlüsselablauf

Kann mir bitte jemand helfen?

public class SessionCacheRepositoryImpl implements SessionCacheRepository { 

    private static final String KEY = "Session"; 

    private RedisTemplate<String, Object> redisTemplate; 
    private HashOperations hashOperations; 

    @Autowired 
    public SessionCacheRepositoryImpl(RedisTemplate<String, Object> redisTemplate) { 
     this.redisTemplate = redisTemplate; 
    } 

    @PostConstruct 
    private void init() { 
     hashOperations = redisTemplate.opsForHash(); 
     redisTemplate.expire(KEY, 30, TimeUnit.SECONDS); 
    } 

    public void saveSession(final Session session) { 
     hashOperations.put(KEY, session.getSessionID(), session); 
    } 
} 

Und das ist meine Config-Klasse

private RedisTemplate<String, Object> template; 

@Bean 
JedisConnectionFactory jedisConnectionFactory() { 
    JedisConnectionFactory jedisConFactory = new JedisConnectionFactory(); 
    jedisConFactory.setHostName("localhost"); 
    jedisConFactory.setPort(36919); 
    return jedisConFactory; 
} 

@Bean 
public RedisTemplate<String, Object> redisTemplate() { 
    template = new RedisTemplate<String, Object>(); 
    template.setConnectionFactory(jedisConnectionFactory()); 
    template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class)); 
    return template; 
} 

Antwort

3

Der Aufruf von redisTemplate.expire(KEY, 30, TimeUnit.SECONDS) erfolgt in der init-Methode, die aufgerufen wird, nachdem Dependency Injection stattfindet Ihre Klasse zu initialisieren. Zu diesem Zeitpunkt ist der Schlüssel Session nicht vorhanden. Daher hat das Aufrufen des Befehls expire keinen Effekt. Eine vollständige Beschreibung finden Sie in der Redis.io Beschreibung für EXPIRE. Sie können dies testen, indem Sie das Rückgabeergebnis des Befehls expire erfassen und die Ergebnisse protokollieren.

Anstatt expire in der init-Methode aufzurufen, sollten Sie sie in der save-Methode aufrufen, um die Ablaufzeit für Ihre Sitzung beim Speichern festzulegen.

+0

Vielen Dank !! Es funktioniert :) – Happy

+1

Ich habe vergessen zu erwähnen, in Ihrem Code-Beispiel verwenden Sie immer den Schlüssel 'Session' - so alle Ihre speichert überschreibt den gleichen Schlüssel. Ist es das was du willst? –

+1

Nein, ich habe gerade poc mit diesem eigentlich ich dachte an den Schlüssel als Sitzungs-ID zu speichern, aber jetzt muss ich sessionId zweimal definieren. Eine für Schlüssel und eine für Bezeichner. 'hashOperations.put (session.getSessionID(), session.getSessionID(), Sitzung); redisTemplate.expire (session.getSessionID(), 30, TimeUnit.MINUTES); ' Gibt es eine Möglichkeit, dass ich SessionID nur als Schlüssel verwenden und mein Objekt speichern kann? – Happy

Verwandte Themen