我正在使用 Redis 存储一组校验和。我在解析大型数据集时增加我看到的每个成员,并使用分数来确定我多次“访问”过哪些成员。但是,由于此操作是定期进行的,因此我想之后将所有成员的分数重置为零。有没有这样做的好方法?
我知道 ZRANGEBYSCORE,也许可以将它返回的内容“复制”到新密钥中,但是对于大量数据,这是不太可取的。我也可以在过程开始时取最低分数,然后 ZREMRANGEBYSCORE 一切都等于或低于该分数,但这似乎也是不可取的,因为我的分数会继续无限上升。
我正在使用 Redis 存储一组校验和。我在解析大型数据集时增加我看到的每个成员,并使用分数来确定我多次“访问”过哪些成员。但是,由于此操作是定期进行的,因此我想之后将所有成员的分数重置为零。有没有这样做的好方法?
我知道 ZRANGEBYSCORE,也许可以将它返回的内容“复制”到新密钥中,但是对于大量数据,这是不太可取的。我也可以在过程开始时取最低分数,然后 ZREMRANGEBYSCORE 一切都等于或低于该分数,但这似乎也是不可取的,因为我的分数会继续无限上升。
您可以使用WEIGHTS值为零的 ZUNIONSTORE 来复制集合并将所有分数归零,例如
ZUNIONSTORE myZeroedSet 1 myInitialSet WEIGHTS 0
RENAME myZeroedSet myInitialSet
权重为零将导致 myInitialSet 中的所有分数都乘以零,从而重置它们。RENAME 将成功,而无需您先明确删除 myInitialSet。
这样做的好处是它发生在 Redis 内部(您不必通过网络传输整个集合并返回),而且速度很快。
最好和最快的方法是使用一个简单的 LUA 脚本:
eval "local z=redis.call('ZRANGE', KEYS[1], 0, -1) for i=1, #z, 1 do redis.call('ZADD', KEYS[1], 0, z[i]) end" 1 myInitialSet
它是原子的,一切都发生在 Redis 内部。