自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

拼多多面試:如何用Redis統(tǒng)計(jì)獨(dú)立用戶訪問量?

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

眾所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遺余力,對于一些工作3年的開發(fā),稍微優(yōu)秀一點(diǎn)的,都給到30K的Offer。

當(dāng)然,拼多多加班也是出名的,一周上6天班是常態(tài),每天工作時(shí)間基本都是超過12個小時(shí),也是相當(dāng)辛苦的。

廢話不多說,今天我們來聊一聊拼多多的一道后臺面試真題,是一道簡單的架構(gòu)類的題目:

拼多多有數(shù)億的用戶,那么對于某個網(wǎng)頁,怎么使用Redis來統(tǒng)計(jì)一個網(wǎng)站的用戶訪問數(shù)呢?

使用Hash

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

當(dāng)一個用戶訪問的時(shí)候,如果用戶登陸過,那么我們就使用用戶的id,如果用戶沒有登陸過,那么我們也能夠前端頁面隨機(jī)生成一個key用來標(biāo)識用戶。

當(dāng)用戶訪問的時(shí)候,我們可以使用HSET命令,key可以選擇URI與對應(yīng)的日期進(jìn)行拼湊,field可以使用用戶的id或者隨機(jī)標(biāo)識,value可以簡單設(shè)置為1。

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

 

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

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

使用Bitset

我們知道,對于一個32位的int,如果我們只用來記錄id,那么只能夠記錄一個用戶,但如果我們轉(zhuǎn)成2進(jìn)制,每位用來表示一個用戶,那么我們就能夠一口氣表示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)計(jì)該網(wǎng)頁每天的訪問數(shù)量。

 

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

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

使用概率算法

對于拼多多這種多個頁面都可能非常多訪問量的網(wǎng)站,如果所需要的數(shù)量不用那么準(zhǔn)確,可以使用概率算法。

事實(shí)上,我們對一個網(wǎng)站的UV的統(tǒng)計(jì),1億跟1億零30萬其實(shí)是差不多的。

在Redis中,已經(jīng)封裝了HyperLogLog算法,他是一種基數(shù)評估算法。這種算法的特征,一般都是數(shù)據(jù)不存具體的值,而是存用來計(jì)算概率的一些相關(guān)數(shù)據(jù)。

 

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

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

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

上面就是常見的3種適用Redis統(tǒng)計(jì)網(wǎng)站用戶訪問數(shù)的方法了。

 

責(zé)任編輯:龐桂玉 來源: 數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2024-06-03 08:09:46

2019-08-05 10:03:49

技術(shù)面試互聯(lián)網(wǎng)

2009-08-26 11:33:28

Twitter

2019-10-31 09:32:58

Redis微博緩存

2009-07-30 15:50:49

ASP.NET中網(wǎng)站訪

2009-01-12 10:39:55

Twitter訪問量SNS

2021-08-08 22:08:41

Redis開發(fā)網(wǎng)頁

2018-05-21 09:15:06

Redis美團(tuán)點(diǎn)評數(shù)據(jù)庫運(yùn)維

2018-01-30 14:26:49

監(jiān)控應(yīng)用性能管理運(yùn)維管理

2023-06-05 08:17:03

2013-12-30 10:33:43

訪問量12306癱瘓

2011-06-19 12:12:12

網(wǎng)站瀏覽量訪問量

2023-11-29 20:03:03

2022-07-17 06:54:51

Eureka架構(gòu)

2019-10-28 11:00:37

RedisMySQL數(shù)據(jù)庫

2018-06-08 09:48:52

緩存架構(gòu)設(shè)計(jì)

2019-07-24 08:55:09

APP重設(shè)計(jì)界面

2024-06-11 10:03:56

2020-03-05 18:41:24

騰訊微信健康碼

2018-09-28 08:53:25

服務(wù)器架構(gòu)訪問量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號