使用以下模型:
@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
项目也会被删除,但其他项目也不会被删除。这是一个错误还是需要配置/实现更多的东西?
答案 0 :(得分:2)
您的应用需要保持活跃状态。 Redis存储库使用键空间事件来获得有关到期的通知,因此Spring Data Redis可以清理索引结构。 Redis仅支持顶级键的到期,它不支持列表/集合元素的到期。
:phantom
密钥的到期时间略长,这就是原始密钥到期后到期的原因。它用于为索引清理提供过期的哈希值等。