Jedis键到期

9

我正在尝试使用Spring集成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个回答

9
您的init方法调用了redisTemplate.expire(KEY, 30, TimeUnit.SECONDS),该方法会在依赖注入后被调用以初始化您的类。此时,键Session不存在,因此调用过期命令没有任何效果。请参阅Redis.io中EXPIRE的描述。您可以通过捕获过期命令的返回结果并记录结果来测试它。
相反,您应该在保存方法中调用expire,以在保存会话时设置过期时间。

2
在你的代码示例中,我忘了提到你总是使用键“Session”,因此所有保存都将覆盖相同的键。这是你想要的吗? - Tague Griffith
2
不,我只是在进行那个 poc。 实际上,我原本想将密钥保存为会话 ID,但现在在输入中,我必须定义两次 sessionId。一次用于键,一次用于标识符。hashOperations.put(session.getSessionID(), session.getSessionID(), session); redisTemplate.expire(session.getSessionID(), 30, TimeUnit.MINUTES); 有没有办法我可以只使用 sessionID 作为键并保存我的对象? - Happy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接