即使Redis过期,Redis仍会返回空条目

时间:2019-05-17 07:26:13

标签: java spring spring-boot redis spring-data-redis

我正在将Spring Repositories与Redis一起使用,并希望将有关用户的数据存储10秒钟,并使它们从Redis中过期(并删除)。 我知道过期和删除是不同的,但是有没有一种简单的方法可以删除它们,就像我自动将它们过期一样。

我有以下实体

@RedisHash(value = "User", timeToLive = 10)
public class User {
    @Id
    private String id;
    @Indexed
    @ApiModelProperty(notes = "First name of the user")
    private String firstName;
    @ApiModelProperty(notes = "Last name of the user")
    private String lastName;

    ...
    ...
}

存储库

@Repository
public interface UserRepository extends CrudRepository<User, String> {
}

Redis的配置

@Configuration
public class RedisConfig {

    @Value("${redis.hostname}")
    private String redisHostname;
    @Value("${redis.port}")
    private int redisPort;

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHostname, redisPort);
        return new JedisConnectionFactory(redisStandaloneConfiguration);
    }

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

当我从存储库中使用findAll方法获取所有实体(如果它们都已过期)时,我会得到一堆空值,并且可以看到它们在带有Redis客户端的Redis中。我担心这将使大量过期数据填充数据库。有没有办法删除过期的实体。

2 个答案:

答案 0 :(得分:1)

  

当到期设置为正值时,将执行相应的EXPIRE命令。除了保留原始副本外,幻影副本还保留在Redis中,并设置为在原始副本后五分钟到期。

有关更多信息,请参考here

希望this post对您有所帮助。

答案 1 :(得分:1)

简短的答案是:

放置以下注释:

@EnableRedisRepositories(enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP)

在您的主类之上(SpringBootApplication)

对象现在将从Redis存储区中删除:)