<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何用 Redis 統(tǒng)計獨立用戶訪問量?

          共 1562字,需瀏覽 4分鐘

           ·

          2020-11-04 10:32

          文章來源:https://url.cn/5tQPEQg

          今天來聊一聊拼多多的一道后臺面試真題,是一道簡單的架構(gòu)類的題目:拼多多有數(shù)億的用戶,那么對于某個網(wǎng)頁,怎么使用Redis來統(tǒng)計一個網(wǎng)站的用戶訪問數(shù)呢?

          使用Hash

          哈希是Redis的一種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),Redis底層維護的是一個開散列,會把不同的key映射到哈希表上,如果是遇到關(guān)鍵字沖突,那么就會拉出一個鏈表出來。

          當(dāng)一個用戶訪問的時候,如果用戶登陸過,那么我們就使用用戶的id,如果用戶沒有登陸過,那么我們也能夠前端頁面隨機生成一個key用來標(biāo)識用戶,當(dāng)用戶訪問的時候,我們可以使用HSET命令,key可以選擇URI與對應(yīng)的日期進行拼湊,field可以使用用戶的id或者隨機標(biāo)識,value可以簡單設(shè)置為1。

          當(dāng)我們要統(tǒng)計某一個網(wǎng)站某一天的訪問量的時候,就可以直接使用HLEN來得到最終的結(jié)果了。

          優(yōu)點:簡單,容易實現(xiàn),查詢也是非常方便,數(shù)據(jù)準(zhǔn)確性非常高。

          缺點:占用內(nèi)存過大,。隨著key的增多,性能也會下降。小網(wǎng)站還行,拼多多這種數(shù)億PV的網(wǎng)站肯定受不了

          使用Bitset

          我們知道,對于一個32位的int,如果我們只用來記錄id,那么只能夠記錄一個用戶,但如果我們轉(zhuǎn)成2進制,每位用來表示一個用戶,那么我們就能夠一口氣表示32個用戶,空間節(jié)省了32倍!對于有大量數(shù)據(jù)的場景,如果我們使用bitset,那么,可以節(jié)省非常多的內(nèi)存。對于沒有登陸的用戶,我們也可以使用哈希算法,把對應(yīng)的用戶標(biāo)識哈希成一個數(shù)字id。bitset非常的節(jié)省內(nèi)存,假設(shè)有1億個用戶,也只需要100000000/8/1024/1024約等于12兆內(nèi)存。

          Redis已經(jīng)為我們提供了SETBIT的方法,使用起來非常的方便,我們可以看看下面的例子,我們在item頁面可以不停地使用SETBIT命令,設(shè)置用戶已經(jīng)訪問了該頁面,也可以使用GETBIT的方法查詢某個用戶是否訪問。最后我們通過BITCOUNT可以統(tǒng)計該網(wǎng)頁每天的訪問數(shù)量。

          優(yōu)點占用內(nèi)存更小,查詢方便,可以指定查詢某個用戶,數(shù)據(jù)可能略有瑕疵,對于非登陸的用戶,可能不同的key映射到同一個id,否則需要維護一個非登陸用戶的映射,有額外的開銷。

          缺點如果用戶非常的稀疏,那么占用的內(nèi)存可能比方法一更大。

          使用概率算法

          對于拼多多這種多個頁面都可能非常多訪問量的網(wǎng)站,如果所需要的數(shù)量不用那么準(zhǔn)確,可以使用概率算法,事實上,我們對一個網(wǎng)站的UV的統(tǒng)計,1億跟1億零30萬其實是差不多的。在Redis中,已經(jīng)封裝了HyperLogLog算法,他是一種基數(shù)評估算法。這種算法的特征,一般都是數(shù)據(jù)不存具體的值,而是存用來計算概率的一些相關(guān)數(shù)據(jù)。

          當(dāng)用戶訪問網(wǎng)站的時候,我們可以使用PFADD命令,設(shè)置對應(yīng)的命令,最后我們只要通過PFCOUNT就能順利計算出最終的結(jié)果,因為這個只是一個概率算法,所以可能存在0.81%的誤差。

          優(yōu)點占用內(nèi)存極小,對于一個key,只需要12kb。對于拼多多這種超多用戶的特別適用。

          缺點查詢指定用戶的時候,可能會出錯,畢竟存的不是具體的數(shù)據(jù)。總數(shù)也存在一定的誤差。


          推薦閱讀


          代碼對比工具,我就用這6個

          分享我常用的5個免費的在線 SQL 數(shù)據(jù)庫環(huán)境,簡直太方便了!

          Spring Boot 三招組合拳,手把手教你打出優(yōu)雅的后端接口

          MySQL 5.7 vs 8.0,你選那個?網(wǎng)友:我繼續(xù)原地踏步~


          最后,推薦給大家一個有趣有料的公眾號:寫代碼的渣渣鵬,7年老程序員教你寫bug,回復(fù)”面試“有驚喜哦

          掃碼關(guān)注

          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一级a毛一级a看免费视频乱 | 手机在线看片日韩 | 日韩操片| 狠狠干综合 | 免费播放婬乱男女婬视频国产 |