1、问题描述
有一个存储Zset,Score是时间戳,Member是结构体,选择(ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]),count取值是30。 这个Zset中的数目比较多,13w多,昨天结果验证发现,有一个数据丢失了,有两个数据被重复选择。
2、key结构及操作模型
Key:userbirthts
Score:时间戳
Member:结构体如下
命令:
增加:ZADD
查询:ZREVRANGEBYSCORE
删除:ZREMRANGEBYSCORE
删除:ZREM
3、分析
通过监控看到在执行 zrangebyscore期间其他命令的调用情况。
按30的count去遍历的zset,但是在遍历的过程中,会有zadd和zrem操作,重复读取和漏读取的情况是因为zadd和zrem操作引起每个数据的排位变化,而遍历的offset还是排位顺序去获取数据,这过程就会出现问题。
- 如果是zadd,zadd的member处于你当前遍历的offset之前,则该插入点之后的所有数据的offset都会+1,那么会有member会被重复读取,新增的这个不