Java SpringDataRedis存储库为过期条目返回null

Java SpringDataRedis存储库为过期条目返回null,java,spring,redis,spring-data,Java,Spring,Redis,Spring Data,我在Spring Boot应用程序中使用一个crudepository连接到Redis,在实体中使用一个@TimeToLive带注释的字段用于过期: @RedisHash(“键空间”) 公共类MyRedisEntity{ @Id字符串键; 米波乔·波乔; @时间寿命长; } 公共接口MyRedisRepository扩展了Crudepository{} 现在,当过期发生时,myRedisRepo.findAll()为过期的实体返回null。我发现redis(或spring data redis

我在Spring Boot应用程序中使用一个
crudepository
连接到Redis,在实体中使用一个
@TimeToLive
带注释的字段用于过期:

@RedisHash(“键空间”)
公共类MyRedisEntity{
@Id字符串键;
米波乔·波乔;
@时间寿命长;
}
公共接口MyRedisRepository扩展了Crudepository{}
现在,当过期发生时,
myRedisRepo.findAll()
为过期的实体返回null。我发现redis(或spring data redis)将所有插入实体的id存储在一个集合中,并以键空间作为键:

redis-cli> smembers keyspace
0) key0
1) key1
2) key2
...
redis-cli> hgetall key0
(empty list or set)
我怀疑此集合用于
findAll
调用,由于过期,ID不再作为哈希映射存在,因此返回null。此外,我还尝试使用
RedisKeyExpiredEvent
的侦听器,在applicationEvent中使用存储库的delete方法,但没有帮助

@组件
公共类RedisExpirationListener实现ApplicationListener{
私有MyRedisRepository MyRedisRepository;
@自动连线
公共RedisExpirationListener(MyRedisRepository MyRedisRepository){
this.myRedisRepository=myRedisRepository;
}
@凌驾
ApplicationEvent上的公共无效(RedisKeyExpiredEvent RedisKeyExpiredEvent){
if(redisKeyExpiredEvent.getKeyspace().equals(“keyspace”)){
myRedisRepository.deleteById(新字符串(redisKeyExpiredEvent.getId());
}
}
}
我应该怎么做才能只获取非空条目?理想情况下,我希望完全从redis中删除过期的条目,这样就不会出现在
findAll
中,但如果存储库方法可以返回非空值列表就足够了


(是的,我知道幽灵的行为,但我认为这与我想要的无关)

Hi@aksh1618,你能在哪里解决这个问题?你的解决办法是什么?看到了,但没有修复yet@Enoobong我不得不在使用
findAll
StreamSupport.stream(myRedisRepository.findAll().spliterator(),false)。filter(Objects::nonNull)
好的,谢谢,我也是@aksh1618,在哪里可以解决这个问题?你的解决办法是什么?看到了,但没有修复yet@Enoobong我不得不在使用
findAll
StreamSupport.stream(myRedisRepository.findAll().spliterator(),false)的任何地方进行筛选。筛选(Objects::nonNull)
好的,谢谢,我也是