天天看點

如何用 Redis 統計獨立使用者通路量

衆所周至 ,拼多多的待遇也是高的可怕,在挖人方面也是不遺餘力,對于一些工作3 年的開發,稍微優秀一點的, 都給到30K的Offer,當然,拼多多加班也是出名的,一周上6天班是常态,每天工作時間基本都是超過12個小時,也是相當辛苦的。廢話不多說,今天我們來聊一聊拼多多的一道背景面試真題,是一道簡單的架構類的題目: 拼多多有數億的使用者,那麼對于某個網頁,怎麼使用Redis來統計一個網站的使用者通路數呢?

使用Hash

哈希是Redis的一種基礎資料結構,Redis底層維護的是一個開散列,會把不同的key映射到哈希表上,如果是遇到關鍵字沖突,那麼就會拉出一個連結清單出來。

當一個使用者通路的時候,如果使用者登陸過,那麼我們就使用使用者的id,如果使用者沒有登陸過,那麼我們也能夠前端頁面随機生成一個key用來辨別使用者,當使用者通路的時候,我們可以使用HSET指令,key可以選擇URI與對應的日期進行拼湊,field可以使用使用者的id或者随機辨別,value可以簡單設定為1。

當我們要統計某一個網站某一天的通路量的時候,就可以直接使用HLEN來得到最終的結果了。

如何用 Redis 統計獨立使用者通路量

優點:簡單,容易實作,查詢也是非常友善,資料準确性非常高。

缺點:占用記憶體過大,。随着key的增多,性能也會下降。小網站還行,拼多多這種數億PV的網站肯定受不了使用Bitset

我們知道,對于一個32位的int,如果我們隻用來記錄id,那麼隻能夠記錄一個使用者,但如果我們轉成2進制,每位用來表示一個使用者,那麼我們就能夠一口氣表示32個使用者,空間節省了32倍!對于有大量資料的場景,如果我們使用bitset,那麼,可以節省非常多的記憶體。對于沒有登陸的使用者,我們也可以使用雜湊演算法,把對應的使用者辨別哈希成一個數字id。bitset非常的節省記憶體,假設有1億個使用者,也隻需要100000000/8/1024/1024約等于12兆記憶體。

如何用 Redis 統計獨立使用者通路量

Redis已經為我們提供了SETBIT的方法,使用起來非常的友善,我們可以看看下面的例子,我們在item頁面可以不停地使用SETBIT指令,設定使用者已經通路了該頁面,也可以使用GETBIT的方法查詢某個使用者是否通路。最後我們通過BITCOUNT可以統計該網頁每天的通路數量。

如何用 Redis 統計獨立使用者通路量

優點占用記憶體更小,查詢友善,可以指定查詢某個使用者,資料可能略有瑕疵,對于非登陸的使用者,可能不同的key映射到同一個id,否則需要維護一個非登陸使用者的映射,有額外的開銷。

缺點如果使用者非常的稀疏,那麼占用的記憶體可能比方法一更大。使用機率算法

對于拼多多這種多個頁面都可能非常多通路量的網站,如果所需要的數量不用那麼準确,可以使用機率算法,事實上,我們對一個網站的UV的統計,1億跟1億零30萬其實是差不多的。在Redis中,已經封裝了HyperLogLog算法,他是一種基數評估算法。這種算法的特征,一般都是資料不存具體的值,而是存用來計算機率的一些相關資料。

如何用 Redis 統計獨立使用者通路量

當使用者通路網站的時候,我們可以使用PFADD指令,設定對應的指令,最後我們隻要通過PFCOUNT就能順利計算出最終的結果,因為這個隻是一個機率算法,是以可能存在0.81%的誤差。

優點占用記憶體極小,對于一個key,隻需要12kb。對于拼多多這種超多使用者的特别适用。

繼續閱讀