欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis如何統(tǒng)計(jì)用戶訪問(wèn)量

 更新時(shí)間:2023年07月14日 09:33:10   作者:一傾而盡  
這篇文章主要介紹了Redis如何統(tǒng)計(jì)用戶訪問(wèn)量問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Redis統(tǒng)計(jì)用戶訪問(wèn)量

1. 使用Hash

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

當(dāng)一個(gè)用戶訪問(wèn)時(shí),如果用戶登陸過(guò),那么我們就使用用戶的id,如果用戶沒(méi)有登陸過(guò),那么也可以在前端頁(yè)面隨機(jī)生成一個(gè)key用來(lái)標(biāo)識(shí)用戶,當(dāng)用戶訪問(wèn)的時(shí)候,我們可以使用HSET命令,key可以選擇URI與對(duì)應(yīng)的日期進(jìn)行拼湊,field則可以使用用戶的id或者隨機(jī)標(biāo)識(shí),value則可以簡(jiǎn)單設(shè)置為1。

當(dāng)要訪問(wèn)一個(gè)網(wǎng)站某一天的訪問(wèn)量時(shí),就可以直接使用HLEN來(lái)獲取結(jié)果;

優(yōu)點(diǎn):簡(jiǎn)單,易實(shí)現(xiàn).查詢方便,并且數(shù)據(jù)精準(zhǔn)性非常好.

缺點(diǎn):內(nèi)存占用過(guò)大.隨著key的增多,性能會(huì)隨之下降.無(wú)法支撐大規(guī)模的訪問(wèn)量.

2. 使用Bitset

對(duì)于個(gè)int型的數(shù)來(lái)說(shuō),若用來(lái)記錄id,則只能記錄一個(gè),而若轉(zhuǎn)換為二進(jìn)制存儲(chǔ),則可以表示32個(gè),空間的利用率提升了32倍.對(duì)于海量數(shù)據(jù)的處理,這樣的存儲(chǔ)方式會(huì)節(jié)省很多內(nèi)存空間.對(duì)于未登陸的用戶,可以使用Hash算法,把對(duì)應(yīng)的用戶標(biāo)識(shí)哈希為一個(gè)數(shù)字id.對(duì)于一億個(gè)數(shù)據(jù)來(lái)說(shuō),我們也只需要1000000000/8/1024/1024大約12M空間左右.

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

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

缺點(diǎn):如果用戶過(guò)于稀疏,則占用的內(nèi)存可能比第一個(gè)方法更大

3. 使用概率算法

對(duì)于一個(gè)網(wǎng)站頁(yè)面若訪問(wèn)量非常大的話,如果要求的數(shù)量不是很高,可以考慮使用概率算法。

在Redis中,已經(jīng)對(duì)HyperLogLog算法做了封裝,這是一種基數(shù)評(píng)估算法:不存儲(chǔ)具體數(shù)值,只是存儲(chǔ)用來(lái)計(jì)算概率的一些相關(guān)數(shù)據(jù)。

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

優(yōu)點(diǎn):占用內(nèi)存極小,對(duì)于一個(gè)key,只需要12kb。對(duì)于超大規(guī)模數(shù)據(jù)訪問(wèn)量的網(wǎng)站效率極高

缺點(diǎn):查詢指定用戶的時(shí)候,可能會(huì)出錯(cuò)。在總數(shù)統(tǒng)計(jì)時(shí)也不一定十分精準(zhǔn).

使用Redis做某個(gè)時(shí)間段在線數(shù)統(tǒng)計(jì)

一般有范圍性的需求都可以使用 sorted set 實(shí)現(xiàn)。

sorted set 類型通常用于實(shí)現(xiàn)(排行榜,最新的xxx,延遲隊(duì)列…)

實(shí)現(xiàn)

實(shí)現(xiàn)很簡(jiǎn)單,將用戶的登錄時(shí)間轉(zhuǎn)換成時(shí)間戳作為權(quán)重即可。

假設(shè)用戶1,3 在20220801號(hào)登錄

zadd login 1659283200 1
zadd login 1659283200 3

假設(shè)用戶2,3 在20220802號(hào)登錄

zadd login 1659369600 2
zadd login 1659369600 3

假設(shè)用戶4,在20220803號(hào)登錄

zadd login 1659456000 4

統(tǒng)計(jì)20220801至20220802的在線用戶數(shù)量

# ZCOUNT key min max
# 在線 3
zcount login 1659283200 1659369600

拓展:在上面的基礎(chǔ)上統(tǒng)計(jì)連續(xù)兩天都在線的用戶及其最后登錄時(shí)間

假設(shè)用戶1,3 在20220801號(hào)登錄

zadd login:20220801 1659283200 1
zadd login:20220801 1659283200 3

假設(shè)用戶2,3 在20220802號(hào)登錄

zadd login:20220802 1659369600 2
zadd login:20220802 1659369600 3

假設(shè)用戶4,在20220803號(hào)登錄

zadd login:20220803 1659456000 4

統(tǒng)計(jì)20220801,20220802 兩天都登錄的用戶及其最后登錄時(shí)間

# 將兩個(gè)交集保存至 result:20220801:20220802
# aggregate max 保留最大的權(quán)重(即最后登錄時(shí)間)
# 不使用 aggregate max,權(quán)重會(huì)累加
zinterstore result:20220801:20220802 2 login:20220801 login:20220802 aggregate max
# 展示數(shù)據(jù)
zrange result:20220801:20220802 0 -1 withscores

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于Redis的讀寫一致問(wèn)題

    關(guān)于Redis的讀寫一致問(wèn)題

    在項(xiàng)目使用Redis過(guò)程中,當(dāng)數(shù)據(jù)更新時(shí),我們要保證緩存和數(shù)據(jù)庫(kù)的一致性,否則會(huì)導(dǎo)致很多臟數(shù)據(jù)出現(xiàn),此時(shí)我們就要思考如何去進(jìn)行數(shù)據(jù)更新,本文就給大家講講關(guān)于redis的讀寫一致問(wèn)題,需要的朋友可以參考下
    2023-08-08
  • Redis數(shù)據(jù)庫(kù)中實(shí)現(xiàn)分布式鎖的方法

    Redis數(shù)據(jù)庫(kù)中實(shí)現(xiàn)分布式鎖的方法

    這篇文章主要介紹了Redis數(shù)據(jù)庫(kù)中實(shí)現(xiàn)分布式鎖的方法,Redis是一個(gè)高性能的主存式數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2015-06-06
  • Redis過(guò)期時(shí)間的設(shè)計(jì)與實(shí)現(xiàn)代碼

    Redis過(guò)期時(shí)間的設(shè)計(jì)與實(shí)現(xiàn)代碼

    在?Redis?中,鍵的過(guò)期時(shí)間設(shè)計(jì)與實(shí)現(xiàn)是一個(gè)重要的功能,這使得?Redis?可以自動(dòng)刪除在指定時(shí)間后不再需要的鍵,下面詳細(xì)介紹?Redis?過(guò)期時(shí)間的設(shè)計(jì)和實(shí)現(xiàn),包括設(shè)置過(guò)期時(shí)間、過(guò)期鍵的存儲(chǔ)結(jié)構(gòu)、過(guò)期鍵的刪除策略等,需要的朋友可以參考下
    2024-08-08
  • 詳解三分鐘快速搭建分布式高可用的Redis集群

    詳解三分鐘快速搭建分布式高可用的Redis集群

    這篇文章主要介紹了詳解三分鐘快速搭建分布式高可用的Redis集群,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • redis yml配置的用法小結(jié)

    redis yml配置的用法小結(jié)

    RedisYML配置是Redis的一種配置文件格式,,對(duì)Redis的配置進(jìn)行統(tǒng)一管理,本文就來(lái)介紹了redis yml配置的用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • redis主從+哨兵搭建的實(shí)現(xiàn)示例

    redis主從+哨兵搭建的實(shí)現(xiàn)示例

    本文主要介紹了redis主從+哨兵搭建的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Redis緩存數(shù)據(jù)庫(kù)表(列單獨(dú)緩存)的示例代碼

    Redis緩存數(shù)據(jù)庫(kù)表(列單獨(dú)緩存)的示例代碼

    在Redis中緩存數(shù)據(jù)庫(kù)表數(shù)據(jù),而不使用JSON結(jié)構(gòu)來(lái)表示value,通常意味著我們會(huì)將數(shù)據(jù)庫(kù)表的每一行數(shù)據(jù)映射為Redis中的一個(gè)或多個(gè)鍵值對(duì),這篇文章主要介紹了Redis緩存數(shù)據(jù)庫(kù)表(列單獨(dú)緩存),需要的朋友可以參考下
    2024-03-03
  • Redis序列化設(shè)置以及jetcache連接Redis序列化的設(shè)置過(guò)程

    Redis序列化設(shè)置以及jetcache連接Redis序列化的設(shè)置過(guò)程

    這篇文章主要介紹了Redis序列化設(shè)置以及jetcache連接Redis序列化的設(shè)置過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot讀寫Redis客戶端并實(shí)現(xiàn)Jedis技術(shù)切換功能

    SpringBoot讀寫Redis客戶端并實(shí)現(xiàn)Jedis技術(shù)切換功能

    這篇文章主要介紹了SpringBoot讀寫Redis客戶端并實(shí)現(xiàn)技術(shù)切換功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • 深入理解 Redis Template及4種序列化方式

    深入理解 Redis Template及4種序列化方式

    這篇文章主要介紹了深入理解 Redis Template及4種序列化方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論