工作中有用到redis濾重佇列。
原來的方法如下:
方法一
優點:簡單,直觀。
缺陷:lrem的時間複雜度為o(n),n為佇列中的元素個數;所以,效能一般。
因為防止佇列內容過多,防止發生n級別的刪除操作,限制了乙個濾重的閥值,如果超過這個閥值就不能使用濾重功能。
方法二
為了解決以上痛點,新玩法為:
優點:因為是bitmap演算法,在查詢是否存在執行的offset的時候,時間複雜度是o(1),並且與佇列中元素個數無關。
優雅,如果算是優點的話,哈哈。
缺點:最重要的一點是redis bitmap的offset必須是int
,比如,long範圍的offset是不存在的,這是乙個很重要
的點,一定要注意(都是血淚史)。
因為入隊和出隊都進行了bitmap的資料維護,所以需要確保在編碼的時候一定謹慎,足夠健壯。
總結
從上面的分析來看,感覺方法二完勝方法一。其實不盡然,只能說各有不同的場景。
方法一比較通用,不論入隊的內容是什麼,都可能濾重,方法二依賴與bitmap演算法,意味key只能是數值型的元素。
在實際應用中,以上兩種濾重方式一般是可以聯合使用的。如果key是數值型別,沒有超出int的取值範圍,那麼就直接使用方法二,如果超出了int的取值範圍的數值就使用方法一。
擴充套件
還有一種濾重的演算法叫:布隆過濾器,感興趣的同學可以了解下:bloom filter。如果不需要刪除,不在乎誤判率的話那應該是很合適的乙個演算法,空間和時間都很高效。
另外如果有人遇到過其他的一些坑或者有更好的建議,歡迎指點。
Bitmap演算法應用
防火牆控制了某一目標ip的那些埠可以被使用者ip訪問,然而防火牆並沒有用一條規則直接限定某一使用者ip所能訪問的目標ip及其埠,而是在配置中設定了一組訪問控制規則,這些規則中既有允許訪問的目標ip及埠範圍,又有不允許訪問的目標ip及埠範圍。就某一目標ip而言,如何才能確定使用者ip能訪問該目標ip的...
Redis的bitmap簽到應用
redis中位圖 bitmap 是由多個二進位制組成的陣列,陣列中的每個二進位制都有與之對應的偏移量 也稱索引 使用者通過偏移量可以對位圖中指定的乙個或多個二進位制進行操作。計算公式 offset 8 1024 1024 mb 儲存1千萬標記資訊,記憶體1.2mb的樣子,是不是很小。在時間開發中,我...
Redis的bitmap的應用例子
上篇部落格介紹了redis14個指令組中的strings組中的所有指令,其中有很多關於bitmap的指令。bitmap的使用可以大大減少記憶體的使用,而且計算機對二進位制的操作成本非常的低。下面舉幾個例子,來具體說明一下bitmap的幾個應用場景。問題一 在乙個商戶系統中,擁有5千萬的使用者,需要統...