国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用 Redis 統(tǒng)計網(wǎng)站 UV 的方法

這篇具有很好參考價值的文章主要介紹了使用 Redis 統(tǒng)計網(wǎng)站 UV 的方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用 Redis 統(tǒng)計網(wǎng)站 UV 的方法(概率算法)

文章目錄

    • 前言
    • 思路
    • HyperLogLog
      • 使用 Redis 命令操作
      • 使用 Java 代碼操作
    • HyperLogLog 實現(xiàn)原理及特點
    • 使用 Java 實現(xiàn) HyperLogLog
    • 小結(jié)

前言

網(wǎng)站 UV 就是指網(wǎng)站的獨(dú)立用戶訪問量Unique Visitor,即相同用戶的多次訪問需要去重。

思路

提到 UV 去重,猜大家都會想到Set集合類。

  • 使用Set集合是一個不錯的辦法,Set里面存儲用戶的id。每一個用戶訪問頁面的時候,我們直接把id存入Set,最終獲取Setsize即可。問題就是Set的容量需要設(shè)置多大呢?如果應(yīng)用是分布式的,是否需要合并操作?第一個問題其實可以通過計算來估計,如果用戶量上億的話,存儲空間也是需要非常大的;第二個問題其實可以通過 Redis、DB 等存儲,如 Redis 的Set結(jié)構(gòu),DB 的唯一鍵。
  • 我們上面提到的 DB 也是一種解決方案,不過寫入量很大時,數(shù)據(jù)庫壓力會比較大。用戶如果很多,則row也相應(yīng)的多,且可能需要對每天的數(shù)據(jù)進(jìn)行分表。在用戶訪問量小的情況下,可以采用該處理方式。

上面兩種方式雖然可以實現(xiàn)統(tǒng)計網(wǎng)站 UV 的功能,但是一個比較占用內(nèi)存,一個比較占用數(shù)據(jù)庫資源。那我們該如何規(guī)避這兩個問題呢?在這里,我們就介紹另外一種實現(xiàn)方法,即使用 Redis 里面的HyperLogLog結(jié)構(gòu),且僅占用12k的空間。

HyperLogLog

HyperLogLog的使用比較簡單,實現(xiàn)略復(fù)雜。我們先看一下如何利用HyperLogLog來進(jìn)行頁面 UV 的統(tǒng)計。

使用 Redis 命令操作

# 添加元素
127.0.0.1:6379> pfadd user zhangsan lisi wangwu
# 添加成功返回1,添加失敗返回0
(integer) 1
# 統(tǒng)計數(shù)量
127.0.0.1:6379> pfcount user
# 返回現(xiàn)在數(shù)量
(integer) 3
# 再生成一個pfkey
127.0.0.1:6379> pfadd user2 zhangsan2 lisi2 wangwu
(integer) 1
127.0.0.1:6379> pfcount user2
(integer) 3
# pfmerge會將后面pfkey中的值合并到前面的pfkey中
127.0.0.1:6379> pfmerge user2 user
OK
# 查看merge后的user2
127.0.0.1:6379> pfcount user2
(integer) 5

使用 Java 代碼操作

import org.springframework.data.redis.core.HyperLogLogOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class RedisService {
    @Resource
    private RedisTemplate < String, String > redisTemplate;
    /*** 記錄用戶訪問** @param user*/
    public long statistic(String Key, String user) {
          HyperLogLogOperations<String,String>hyperLogLog=redisTemplate.opsForHyperLogLog();
            return hyperLogLog.add(Key, user);
        }
        /*** 統(tǒng)計當(dāng)前 UV** @return*/
    public long size(String Key) {
          HyperLogLogOperations<String,String>hyperLogLog=redisTemplate.opsForHyperLogLog();
            return hyperLogLog.size(Key);
        }
        /*** 刪除當(dāng)前 key*/
    public void clear(String Key) {
        HyperLogLogOperations < String,String>hyperLogLog=redisTemplate.opsForHyperLogLog();
        hyperLogLog.delete(Key);
    }
}

HyperLogLog 實現(xiàn)原理及特點

  • 原理:其實這是個概率問題。舉個 Java 的例子,我們每次將一個字符串放入HyperLogLog,其實是把字符串轉(zhuǎn)換成了一個值,可以把它當(dāng)成hash值,將這個值轉(zhuǎn)換成 2 進(jìn)制,從后向前看第一個 1 出現(xiàn)的位置。那么 1 出現(xiàn)在第三個位置的時候(xxxx x100),概率是多少呢?(1/2)^3=1/8,也就是大概有八個數(shù)字進(jìn)到這個數(shù)據(jù)結(jié)構(gòu)時,第一個 1 曾出現(xiàn)在第三個的位置的可能會比較大,所以我們只需要維護(hù)一個 1 出現(xiàn)位置的最大值(暫且稱之為max position),我們就可以知道整個HyperLogLog數(shù)量是多少了。
  • 去重:我們上面講到hash值,其實整個算法就是將一個固定的value固定的映射成一個數(shù)字就可以解決重復(fù)的問題了。如zhangsan對應(yīng)8,那么max position=4,再來一個zhangsan,還是對應(yīng)8,則max position不變。
  • 特點:因為是概率問題,總會出現(xiàn)不準(zhǔn)確的情況,所以你在使用HyperLogLog時,可以將user數(shù)量設(shè)置大一些,如 100W。但是其結(jié)果,有可能你看到的是不到 100W,也有可能計算出來的 UV 還比 100W 大。

使用 Java 實現(xiàn) HyperLogLog

public class HyperLogLogSelf {
    static class BitKeeper {
        private int maxBits;

        public void random() {// 這里的隨機(jī)數(shù)可以當(dāng)成一個對象的hashCode。
            // long value = new Object().hashCode() ^ (2 << 32);
            long value = ThreadLocalRandom.current().nextLong(2L << 32);
            int bits = lowZeros(value);
            if (bits > this.maxBits) {
                this.maxBits = bits;
            }
        }

        /*** 低位有多少個連續(xù)0* 思路上 ≈ 倒數(shù)第一個1的位置** @param value* @return*/
        private int lowZeros(long value) {
            int i = 1;
            for (; i < 32; i++) {
                if (value >> i << i != value) {
                    break;
                }
            }
            return i - 1;
        }
    }

    static class Experiment {
        private int n;
        private BitKeeper keeper;

        public Experiment(int n) {
            this.n = n;
            this.keeper = new BitKeeper();
        }

        public void work() {
            for (int i = 0; i < n; i++) {
                this.keeper.random();
            }
        }

        public void debug() {
            double v = Math.log(this.n) / Math.log(2);
            System.out.printf("%d %.2f %d\n", this.n, v, this.keeper.maxBits);
        }
    }

    public static void main(String[] args) {
        for (int i = 10000; i < 1000000; i += 10000) {
            Experiment exp = new Experiment(i);
            exp.work();
            exp.debug();
        }
    }
}

如上述代碼所示,如果只有一個BitKeeper,那么精度很難控制,BitKeeper越多,則越精確,所以 Redis 在設(shè)置HyperLogLog的時候,設(shè)置了16384個桶,也就是2^14,每個桶的maxbits需要 6 個bit來存儲,最大可以表示maxbits=63,于是總共占用內(nèi)存就是2^14 * 6 / 8 = 12k字節(jié)。

小結(jié)

我們從應(yīng)用場景開始,講述了HyperLogLog的使用方法和實現(xiàn)原理,還給出了HyperLogLog的 Java 簡單實現(xiàn)。

最后,我們在使用HyperLogLog的時候,需要注意:文章來源地址http://www.zghlxwxcb.cn/news/detail-480884.html

  • HyperLogLog需要占用12k內(nèi)存的(數(shù)據(jù)量大的時候),所以HyperLogLog不適合單獨(dú)存儲一個user相關(guān)的信息;
  • HyperLogLog是有一定精度損失的,可能比真實數(shù)量多,也可能比真實數(shù)量少,但基本上都在n‰(0<n<10)以內(nèi)。

到了這里,關(guān)于使用 Redis 統(tǒng)計網(wǎng)站 UV 的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Redis應(yīng)用】UV統(tǒng)計(四)

    【Redis應(yīng)用】UV統(tǒng)計(四)

    ??Redis應(yīng)用學(xué)習(xí)·第四站~ ??本文已收錄至專欄:Redis技術(shù)學(xué)習(xí) 首先我們要搞懂兩個概念: UV :全稱 Unique Visitor ,也叫 獨(dú)立訪客量 ,是指通過互聯(lián)網(wǎng)訪問、瀏覽這個網(wǎng)頁的自然人。1天內(nèi)同一個用戶多次訪問該網(wǎng)站,只記錄1次。 PV :全稱 Page View ,也叫 頁面訪問量或點擊量

    2024年02月09日
    瀏覽(32)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink 網(wǎng)站UV統(tǒng)計

    在實際應(yīng)用中,我們往往會關(guān)注,到底有多少不同的用戶訪問了網(wǎng)站,所以另外一個統(tǒng)計流量的重要指標(biāo)是網(wǎng)站的獨(dú)立訪客數(shù)(Unique Visitor,UV)。 對于UserBehavior數(shù)據(jù)源來說,我們直接可以根據(jù)userId來區(qū)分不同的用戶。 將userid放到SET集合里面,統(tǒng)計集合長度,便可以統(tǒng)計到網(wǎng)

    2024年02月11日
    瀏覽(26)
  • Redis - 附近商鋪、用戶簽到、UV統(tǒng)計

    Redis - 附近商鋪、用戶簽到、UV統(tǒng)計

    底層都是基于地理坐標(biāo)進(jìn)行搜索,支持地理坐標(biāo)的技術(shù)有很多,Redis就是其中之一 GEO 就是Geolocation的簡寫形式,代表 地理坐標(biāo) 。 Redis 在3.2版本中加入了對GEO的支持, 允許存儲地理坐標(biāo)信息 ,幫助我們根據(jù)經(jīng)緯度來檢索數(shù)據(jù)。 常見的命令有 : GEOADD :添加一個地理空間信息,

    2024年02月13日
    瀏覽(21)
  • Redis:原理速成+項目實戰(zhàn)——Redis企業(yè)級項目實戰(zhàn)終結(jié)篇(HyperLogLog實現(xiàn)UV統(tǒng)計)

    Redis:原理速成+項目實戰(zhàn)——Redis企業(yè)級項目實戰(zhàn)終結(jié)篇(HyperLogLog實現(xiàn)UV統(tǒng)計)

    ?????作者簡介:一位大四、研0學(xué)生,正在努力準(zhǔn)備大四暑假的實習(xí) ??上期文章:Redis:原理速成+項目實戰(zhàn)——Redis實戰(zhàn)14(BitMap實現(xiàn)用戶簽到功能) ??訂閱專欄:Redis:原理速成+項目實戰(zhàn) 希望文章對你們有所幫助 這篇是實戰(zhàn)部分的終結(jié)篇,其實Redis的核心操作,主要是

    2024年01月17日
    瀏覽(25)
  • 網(wǎng)站百度統(tǒng)計被惡意刷廣告的處理方法

    網(wǎng)站百度統(tǒng)計被惡意刷廣告的處理方法

    在百度統(tǒng)計的數(shù)據(jù)中,查看網(wǎng)站的實時訪客或者來源,有時候,會發(fā)現(xiàn)有一些亂七八糟的用戶流量,這并不是網(wǎng)站被攻擊或者被刷流量了,而是百度統(tǒng)計被被惡意刷廣告,只是針對統(tǒng)計的行為,不影響網(wǎng)站的排名。 現(xiàn)象: 1、訪問的鏈接,鏈接中有問號?,并包含其他網(wǎng)站的網(wǎng)

    2024年02月04日
    瀏覽(18)
  • 基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV

    基于埋點日志數(shù)據(jù)的網(wǎng)絡(luò)流量統(tǒng)計 - PV、UV

    水善利萬物而不爭,處眾人之所惡,故幾于道?? 一、 網(wǎng)站總流量數(shù)統(tǒng)計 - PV ? 1. 需求分析 ? 2. 代碼實現(xiàn) ?? 方式一 ?? 方式二 ?? 方式三:使用process算子實現(xiàn) ?? 方式四:使用process算子實現(xiàn) 二、網(wǎng)站獨(dú)立訪客數(shù)統(tǒng)計 - UV ? 1. 需求分析 ? 2. 代碼實現(xiàn) ??PV全稱

    2024年02月14日
    瀏覽(26)
  • 3dmax uv貼圖方法大全

    3dmax uv貼圖方法大全

    方法1 / 渲染 材質(zhì)編輯器 在基本色 漫反射中 選擇 位圖 image.png 點擊查看圖像調(diào)整要顯示區(qū)域. image.png 多邊形編輯模式選擇面. 然后分離出一個單獨(dú)的面 image.png 把材質(zhì)拖上去,勾選應(yīng)用即可 image.png 方法2 uvm貼圖 支持多種方式投射貼圖 , 支持gizmo縮放 移動調(diào)整 ,類似投影儀的效

    2024年02月10日
    瀏覽(22)
  • 統(tǒng)計鳥網(wǎng)站統(tǒng)計搜索引擎蜘蛛名稱及釋義

    統(tǒng)計鳥網(wǎng)站統(tǒng)計搜索引擎蜘蛛名稱及釋義

    搜索引擎用來爬行和訪問頁面的程序被稱為蜘蛛(spider),也叫機(jī)器人(bot)。搜索引擎蜘蛛訪問網(wǎng)站頁面時類似于普通用戶使用瀏覽器,蜘蛛程序發(fā)出頁面訪問請求后,服務(wù)器返回HTML代碼,蜘蛛程序把收到的代碼存入原始頁面數(shù)據(jù)庫,搜索引擎為了提高爬行和抓取的速度,

    2024年04月27日
    瀏覽(34)
  • 面試題分析:統(tǒng)計網(wǎng)站訪問次數(shù)

    面試題分析:統(tǒng)計網(wǎng)站訪問次數(shù)

    難度:較低 平臺的訪問量非常高,需要實時統(tǒng)計網(wǎng)站的訪問次數(shù),請設(shè)計一個計數(shù)器解決: 初級工程師,可能回答使用synchronized鎖或重入鎖,進(jìn)一步探討,synchronized鎖太重,有沒其他方式,可能回答atomic類,進(jìn)一步問,atomic類原理,什么場景下適合用,什么場景下不適合用

    2024年02月12日
    瀏覽(25)
  • Python3.6統(tǒng)計模塊statsmodels的安裝教程及使用方法

    Python3.6統(tǒng)計模塊statsmodels的安裝教程及使用方法 如果你需要對數(shù)據(jù)進(jìn)行深入的統(tǒng)計分析和建模,那么Python編程語言中的statsmodels模塊會是你的不二之選。該模塊提供了多種統(tǒng)計模型、工具和功能,用于進(jìn)行統(tǒng)計建模、推斷、預(yù)測以及數(shù)據(jù)探索。本文將為大家詳細(xì)介紹Python3.6下

    2024年02月11日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包