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