手把手帶你使用Redis+Bitmap實現億級海量數據統計

本篇文章是redis的實戰篇,介紹一下使用redis+bitmap實現億級海量數據統計的方法,希望對大家有所幫助!

手把手帶你使用Redis+Bitmap實現億級海量數據統計

在移動應用的業務場景中,我們需要保存這樣的信息:一個 key 關聯了一個數據集合。【相關推薦:redis

常見的場景如下:

  • 給一個 userId ,判斷用戶登陸狀態;
  • 顯示用戶某個月的簽到次數和首次簽到時間;
  • 兩億用戶最近 7 天的簽到情況,統計 7 天內連續簽到的用戶總數;

通常情況下,我們面臨的用戶數量以及訪問量都是巨大的,比如百萬、千萬級別的用戶數量,或者千萬級別、甚至億級別的訪問信息。

所以,我們必須要選擇能夠非常高效地統計大量數據(例如億級)的集合類型。

如何選擇合適的數據集合,我們首先要了解常用的統計模式,并運用合理的數據了性來解決實際問題。

四種統計類型:

  • 二值狀態統計;

  • 聚合統計;

  • 排序統計;

  • 基數統計。

本文將由二值狀態統計類型作為實戰篇系列的開篇,文中將用到 redis 以外的拓展數據類型 Bitmap 來實現。

文章涉及到的指令可以通過在線 redis 客戶端運行調試,地址:redis

寄語

多分享多付出,前期多給別人創造價值并且不計回報,從長遠來看,這些付出都會成倍的回報你。特別是剛開始跟別人合作的時候,不要去計較短期的回報,沒有太大意義,更多的是鍛煉自己的視野、視角以及解決問題的能力。

二值狀態統計

碼哥,什么是二值狀態統計呀?

也就是集合中的元素的值只有 0 和 1 兩種,在簽到打卡和用戶是否登陸的場景中,只需記錄簽到(1)或 未簽到(0),已登錄(1)或未登陸(0)。

假如我們在判斷用戶是否登陸的場景中使用 Redis 的 String 類型實現(key -> userId,value -> 0 表示下線,1 – 登陸),假如存儲 100 萬個用戶的登陸狀態,如果以字符串的形式存儲,就需要存儲 100 萬個字符串了,內存開銷太大。

碼哥,為什么 String 類型內存開銷大?

String 類型除了記錄實際數據以外,還需要額外的內存記錄數據長度、空間使用等信息。

當保存的數據包含字符串,String 類型就使用簡單動態字符串(SDS)結構體來保存,如下圖所示:

手把手帶你使用Redis+Bitmap實現億級海量數據統計