Jedis密钥到期

Hap*_*ppy 6 java spring redis jedis spring-boot

我想用春天来理解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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的配置类

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;
}
Run Code Online (Sandbox Code Playgroud)

Tag*_*ith 8

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

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

  • 我忘了在你的代码示例中提到你总是使用"Session"键 - 所以你的所有保存都会覆盖相同的密钥.那是你要的吗? (2认同)
  • 不,我只是在做poc,实际上我正在考虑将密钥保存为会话ID,但现在在put中我必须定义sessionId两次.一个用于密钥,一个用于标识符.`hashOperations.put(session.getSessionID(),session.getSessionID(),session); redisTemplate.expire(session.getSessionID(),30,TimeUnit.MINUTES); `有什么方法可以只使用sessionID作为键并保存我的对象? (2认同)