Redis-Bitmap

基礎概念

  • 「a」ASCll碼是97,二進制是0110 0001,每一個數「1」,「0」叫作位(bit),每8位叫作一個字節(byte),偏移量從左到右,從1到(二進制總數-1)
  • Bitmap是一串連續的二進制數字(0或1),每一位所在的位置爲偏移(offset),在bitmap上可執行AND,OR,XOR以及其它位操做,實現大數據統計日活躍用戶、避免重複點贊

優勢

  • 效率極高,setbit和getbit的時間複雜度就是O(1),其餘位運算也是效率極高的
  • 極省空間,官網公式($offset/8/1024/1024)MB,假設有2億用戶,須要花200000000/8/1024/1024 = 24M便可

缺點

  • 位計算和位表示數值的侷限

文章重複點贊

SETBIT key offset value大數據

對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit),位的設置或清除取決於 value 參數,能夠是 0 也能夠是 1,當 key 不存在時,自動生成一個新的字符串值;offset 參數必須大於或等於 0 ,小於 2^32 (bit 映射被限制在 512 MB 以內),時間複雜度O(1),返回原偏移量的位code

BITCOUNT key [start] [end]內存

計算給定字符串中,被設置爲 1 的比特位的數量,指定額外的 start 或 end 參數,能夠讓計數只在特定的位上進行,能夠使用負數值:好比 -1 表示最後一個位,而 -2 表示倒數第二個位,以此類推,時間複雜度O(N),返回被設置爲 1 的位的數量字符串

可用於大數據簽到、重複點贊、訂單重複評論等
實現一get

# 假設某用戶id=1,文章id=1,相互拼接爲11,則偏移量11設置成1(前提用戶id和文章id是惟一的)
127.0.0.1:6379>  setbit artcle 11 1
(integer) 0
# 統計所有點贊人數
127.0.0.1:6379> bitcount artcle
(integer) 1
# 模擬重複點贊同一篇文章,返回了1,就能夠根據返回值避免重複點贊
127.0.0.1:6379>  setbit artcle 11 1
(integer) 1

實現二it

# 假設某用戶id=10,有篇文章叫artcleA,則設置artcleA上的位10成1
127.0.0.1:6379>  setbit artcleA 10 1
(integer) 0
# 統計文章artcleA的點贊人數
127.0.0.1:6379> bitcount artcle
(integer) 1
# 模擬重複點贊同一篇文章,返回了1,就能夠根據返回值避免重複點贊
127.0.0.1:6379>  setbit artcleA 10 1
(integer) 1

總結:
倆種方法,角度不一樣實現不一樣,均可以實現目標,第一種方法,優勢存儲內存低,缺點擴展性低,不能查看某篇文章點贊數,第二種方法,擴展性高,能夠經過BITOP方法操做多個key,實現一些統計功能,缺點比第一種花費更多存儲空間效率

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息