簡體   English   中英

Redis SETBIT,GETBIT,BITCOUNT的用例?

[英]Use cases for Redis SETBIT, GETBIT, BITCOUNT?

閱讀后有人可以解釋redis setbit命令嗎?

http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ (在redis文檔中引用)

我仍在努力確定在SET使用SETBIT用例。 上述來源似乎引用了使用SETBIT存儲事件和“二進制”數據集的驅動因素,因為它有助於顯着減少您需要存儲的數據量,同時仍保持易於訪問。

在位圖100000001通過userID(通過0的偏移標識)存儲對網站的每日唯一訪問 - 其中ID 08用戶是唯一具有訪問權限的用戶 - 優於僅設置時間戳:userID? 請解釋。 謝謝。

我為此道歉顯然是一個新手問題。

位是計算機使用的基本數據單元,Redis的BIT *命令允許您輕松操作位值。 在OP提供的示例中,比特流的使用將主要導致空間節省。

為每次登錄保留一個密鑰將花費(至少)密鑰和值的大小,總共大約10個字節,而比特流每個用戶只需要1個比特。

答案是:這取決於。 在上面的用例中,它取決於您每天登錄的次數(位掩碼中有多少位有效)。 如果您有2個登錄或隨機用戶ID,則最好只存儲登錄LIST。

但是如果你有一個活躍的用戶群並且所有用戶中有60%是活躍的..事實證明必須存儲1位(實際上它比平均值少,因為redis只存儲位掩碼直到最高的設置位(1)到達)比在列表中存儲ID更加內存友好。 在列表中存儲ID將導致使用例如32位(整數)來表示1位信息,這是浪費的。 如果列表使用一些樹概念並且具有到相關節點的顯式指針,則可能更多。 由於我們的RAM有點昂貴/有限,而且我們希望事情可以擴展,所以應該盡量減少內存使用,同時滿足所有查詢要求。

所以我會根據用例來決定用例。

但是,使用位掩碼可以非常快速地裝配大型數據集。 假設你存儲了2個位掩碼:1個登錄,今天,1個是signedUpForNewsletter。 通過使用像AND這樣的位操作(處理器可以非常快速地執行這些操作),您可以突然過濾掉所有已登錄的用戶ID(由1的位置表示)並注冊新聞簡報。 因為位掩碼的交叉點可以比id的兩個有序列表快至少一個數量級 ,所以你可以突然對數百萬用戶執行此操作並仍然保持在50ms以下。

總結我的答案:bitmasks的使用允許一些實時分析,否則這些分析將不是實時的,並且如果您期望列表中的許多項目可以節省大量內存。 請注意,這只是一種用法,還有很多其他用法(如bloom過濾器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM