2013-02-26 61 views
0

我正在使用Redis存儲一組校驗和。我會在解析大型數據集時查看每個成員,並使用分數來確定我已經「訪問過」多次。但是,由於此操作定期完成,因此我希望將所有成員的分數重置爲零。有沒有這樣做的好方法?清零所有分類設置分數

我知道ZRANGEBYSCORE,也許可以「複製」它返回的新密鑰,但是對於大量的數據,這是不太理想的。我也可以在流程開始時獲得最低分數,ZREMRANGEBYSCORE則可以獲得低於或低於該分數的所有成績,但這似乎也不可取,因爲我的分數會無限增加。

+0

你可以只刪除包含有序集合的密鑰並繼續使用這個密鑰嗎? – akonsu 2013-02-26 20:49:17

回答

2

您可以使用ZUNIONSTORE,其中WEIGHTS值爲零以複製集合並將所有分數歸零,例如,

ZUNIONSTORE myZeroedSet 1 myInitialSet WEIGHTS 0 
RENAME myZeroedSet myInitialSet 

零的權重將導致myInitialSet中的所有分數乘以零,從而重置它們。 RENAME將成功,而不必先顯式刪除myInitialSet。

這樣做的好處是它發生在Redis內部(您不必通過網絡傳輸整個集合並返回),而且速度很快。

+0

這個答案效果很好。我想雖然你可以通過使用相同的名稱來避免重命名。 'ZUNIONSTORE myInitialSet 1 myInitialSet WEIGHTS 0' – jhorman 2015-06-17 18:15:02

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的了。