Spring Data Redis在TTL到期后不会清除次要地理空间索引

时间:2018-01-10 16:33:06

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

使用以下模型:

@RedisHash("positions")
public class Position {

    @Id
    private String id;

    @GeoIndexed
    private Point coordinates;

    @TimeToLive(unit = TimeUnit.MINUTES)
    protected int ttl;

    //...
}

我注意到Time To Live到期后某些数据仍然存在。注意到期事件之前和之后keys *命令之间的区别:

之前

127.0.0.1:6379> keys *
1) "positions:336514e6-3e52-487a-a88b-98b110ec1c28"
2) "positions:coordinates"
3) "positions:336514e6-3e52-487a-a88b-98b110ec1c28:idx"
4) "positions"
5) "positions:336514e6-3e52-487a-a88b-98b110ec1c28:phantom"

127.0.0.1:6379> keys *
1) "positions:coordinates"
2) "positions:336514e6-3e52-487a-a88b-98b110ec1c28:idx"
3) "positions"
4) "positions:336514e6-3e52-487a-a88b-98b110ec1c28:phantom"

仅删除了positions:336514e6-3e52-487a-a88b-98b110ec1c28项目。

我还注意到,经过一段时间后,*:phantom项目也会被删除,但其他项目也不会被删除。这是一个错误还是需要配置/实现更多的东西?

1 个答案:

答案 0 :(得分:2)

您的应用需要保持活跃状态​​。 Redis存储库使用键空间事件来获得有关到期的通知,因此Spring Data Redis可以清理索引结构。 Redis仅支持顶级键的到期,它不支持列表/集合元素的到期。

:phantom密钥的到期时间略长,这就是原始密钥到期后到期的原因。它用于为索引清理提供过期的哈希值等。