最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

拼多多面試|如何用 Redis 統(tǒng)計(jì)獨(dú)立用戶(hù)訪問(wèn)量?

2020-03-09 11:53 作者:碼上輔導(dǎo)  | 我要投稿

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

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

廢話(huà)不多說(shuō),今天我們來(lái)聊一聊拼多多的一道后臺(tái)面試真題,是一道簡(jiǎn)單的架構(gòu)類(lèi)的題目:

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

使用Hash

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

當(dāng)一個(gè)用戶(hù)訪問(wèn)的時(shí)候,如果用戶(hù)登陸過(guò),那么我們就使用用戶(hù)的id,如果用戶(hù)沒(méi)有登陸過(guò),那么我們也能夠前端頁(yè)面隨機(jī)生成一個(gè)key用來(lái)標(biāo)識(shí)用戶(hù)

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

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

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

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

使用Bitset

我們知道,對(duì)于一個(gè)32位的int,如果我們只用來(lái)記錄id,那么只能夠記錄一個(gè)用戶(hù),但如果我們轉(zhuǎn)成2進(jìn)制,每位用來(lái)表示一個(gè)用戶(hù),那么我們就能夠一口氣表示32個(gè)用戶(hù),空間節(jié)省了32倍!

對(duì)于有大量數(shù)據(jù)的場(chǎng)景,如果我們使用bitset,那么可以節(jié)省非常多的內(nèi)存。

對(duì)于沒(méi)有登陸的用戶(hù),我們也可以使用哈希算法,把對(duì)應(yīng)的用戶(hù)標(biāo)識(shí)哈希成一個(gè)數(shù)字id。bitset非常的節(jié)省內(nèi)存,假設(shè)有1億個(gè)用戶(hù),也只需要100000000/8/1024/1024約等于12兆內(nèi)存。

Redis已經(jīng)為我們提供了SETBIT的方法,使用起來(lái)非常的方便,我們可以看看下面的例子

我們?cè)趇tem頁(yè)面可以不停地使用SETBIT命令,設(shè)置用戶(hù)已經(jīng)訪問(wèn)了該頁(yè)面,也可以使用GETBIT的方法查詢(xún)某個(gè)用戶(hù)是否訪問(wèn)。最后我們通過(guò)BITCOUNT可以統(tǒng)計(jì)該網(wǎng)頁(yè)每天的訪問(wèn)數(shù)量。

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

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

使用概率算法

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

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

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

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

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

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

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

以上就先分享這些吧,大家如果有其他建議或者看法呢可以在評(píng)論區(qū)留言,有技術(shù)問(wèn)題可以進(jìn)行探討哦,我開(kāi)發(fā)10余年了,下面是我的一個(gè)技術(shù)QQ裙,前面是二二六,中間是九八五,后面是九三五。好東西要分享,如果您也是一個(gè)愿意分享的人,那么就加入進(jìn)來(lái)吧。

拼多多面試|如何用 Redis 統(tǒng)計(jì)獨(dú)立用戶(hù)訪問(wèn)量?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
奉化市| 肃北| 蛟河市| 吉木萨尔县| 南宁市| 宽甸| 郴州市| 兴义市| 保定市| 六枝特区| 措美县| 都昌县| 珲春市| 漳平市| 洞头县| 清徐县| 龙井市| 邯郸市| 凤庆县| 汉沽区| 乐平市| 绥阳县| 吉木萨尔县| 北碚区| 博野县| 昌图县| 三门县| 钦州市| 通州市| 芒康县| 体育| 武邑县| 鱼台县| 张掖市| 巧家县| 富阳市| 巴里| 青田县| 泸水县| 泗洪县| 新营市|