web-dev-qa-db-ja.com

ジェダイキーの有効期限

春のredis/jedisを理解しようとしています。一定期間が経過するとキーの有効期限が切れない場所で立ち往生しています。

誰か助けてもらえますか?

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

そしてこれは私の設定クラスです

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;
}
6
Happy

redisTemplate.expire(KEY, 30, TimeUnit.SECONDS)の呼び出しは、クラスを初期化するために依存性注入が行われた後に呼び出されるinitメソッドで行われます。この時点では、キーSessionが存在しないため、expireコマンドを呼び出しても効果はありません。完全な説明については、 [〜#〜] expire [〜#〜] のRedis.ioの説明を参照してください。これをテストするには、expireコマンドからの戻り結果をキャプチャし、結果をログに記録します。

Initメソッドでexpireを呼び出す代わりに、saveメソッドでそれを呼び出して、セッションが保存されるときの有効期限を設定する必要があります。

8
Tague Griffith