我有一个大的redis SET(超过6M条目),我需要遍历所有条目并对每个条目进行一些其他redis操作(主要使用基于原始的密钥在redis排序集中调用ZCARD条目)。
哪个是最有效的(在资源方面)通过SET的所有条目的方式?使用SSCAN或进行SMEMEBERS呼叫。
答案 0 :(得分:5)
SMEMBERS在一次操作中返回SET中的所有成员。此操作的持续时间与SET中的项目数成正比(时间复杂度:O(N))。
在此操作过程中,您的实例不会响应任何其他请求。
SSCAN允许您遍历SET中的所有项目。时间复杂度是固定的(O(1)),具体取决于您在每次调用时获得的项目数(此数字由COUNT参数定义)。 SSCAN的总成本可能与SMEMBERS的成本相同,或者更高,因为您必须拨打多个电话。但是它允许在两次调用之间处理其他请求,因此您的Redis实例看起来不会响应。
所有这些都是纯粹的理论。要获得明确的建议,你应该进行测试和测量,这应该是相当容易的。
答案 1 :(得分:3)
SMEMBERS必须迭代整个集合并立即生成整个密钥列表,而SSCAN每次调用它时都会返回一小部分密钥。虽然他们都做了相同数量的工作,但SSCAN以较小的块进行工作,这意味着,对于大多数用例,它对服务器正在执行的所有其他操作的性能影响较小。