0

我正在使用 Redis 存储一组校验和。我在解析大型数据集时增加我看到的每个成员,并使用分数来确定我多次“访问”过哪些成员。但是,由于此操作是定期进行的,因此我想之后将所有成员的分数重置为零。有没有这样做的好方法?

我知道 ZRANGEBYSCORE,也许可以将它返回的内容“复制”到新密钥中,但是对于大量数据,这是不太可取的。我也可以在过程开始时取最低分数,然后 ZREMRANGEBYSCORE 一切都等于或低于该分数,但这似乎也是不可取的,因为我的分数会继续无限上升。

4

2 回答 2

3

您可以使用WEIGHTS值为零的 ZUNIONSTORE 来复制集合并将所有分数归零,例如

ZUNIONSTORE myZeroedSet 1 myInitialSet WEIGHTS 0
RENAME myZeroedSet myInitialSet

权重为零将导致 myInitialSet 中的所有分数都乘以零,从而重置它们。RENAME 将成功,而无需您先明确删除 myInitialSet。

这样做的好处是它发生在 Redis 内部(您不必通过网络传输整个集合并返回),而且速度很快。

于 2014-01-07T17:29:06.237 回答
1

最好和最快的方法是使用一个简单的 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 内部。

于 2017-02-01T10:07:56.510 回答