Jedis密钥到期

时间:2017-06-09 15:20:26

标签: java spring spring-boot redis jedis

我试图用春天理解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;
}

1 个答案:

答案 0 :(得分:6)

redisTemplate.expire(KEY, 30, TimeUnit.SECONDS)的调用发生在init方法中,该方法将在依赖注入发生后初始化您的类。此时,密钥Session不存在,因此调用expire命令无效。有关完整说明,请参阅EXPIRE的Redis.io说明。您可以通过捕获expire命令的返回结果并记录结果来测试它。

不是在init方法中调用expire,而是应该在save方法中调用它,以便在保存会话时设置会话的到期时间。