【发布时间】:2016-10-12 18:03:46
【问题描述】:
我有一个大的 redis SET(超过 6M 条目),我需要遍历所有条目并对每个条目进行一些其他 redis 操作(主要是使用基于原始的键在 redis Sorted Set 中调用 ZCARD条目)。
遍历 SET 的所有条目的最有效(就资源而言)方法是什么?使用 SSCAN 或进行 SMEMEBERS 调用。
【问题讨论】:
我有一个大的 redis SET(超过 6M 条目),我需要遍历所有条目并对每个条目进行一些其他 redis 操作(主要是使用基于原始的键在 redis Sorted Set 中调用 ZCARD条目)。
遍历 SET 的所有条目的最有效(就资源而言)方法是什么?使用 SSCAN 或进行 SMEMEBERS 调用。
【问题讨论】:
SMEMBERS 在一次操作中返回 SET 中的所有成员。此操作的持续时间与 SET 中的项目数成正比(时间复杂度:O(N))。
在此操作期间,您的实例不会响应任何其他请求。
SSCAN 允许您遍历 SET 中的所有项目。时间复杂度是固定的( O(1) ),具体取决于您在每次调用时获得的项目数(此数字由 COUNT 参数定义)。 SSCAN 的总成本可能与 SMEMBERS 相同,或者可能更高,因为您必须拨打多个电话。但它允许在两次调用之间处理其他请求,因此您的 Redis 实例不会看起来没有响应。
所有这些都是纯理论。要获得明确的建议,您应该进行测试和测量,这应该很容易做到。
【讨论】:
SMEMBERS 必须遍历整个集合并一次生成整个键列表,而 SSCAN 每次调用它时都会返回一小部分键。虽然它们所做的工作量几乎相同,但 SSCAN 以更小的块完成工作,这意味着对于大多数用例而言,它对服务器正在执行的其他所有操作的性能影响较小。
【讨论】: