Redis Note(二)redis其余常見結(jié)構(gòu)

(二)redis其余常見結(jié)構(gòu)

A. bitmaps

  • 概述:本身非一種數(shù)據(jù)結(jié)構(gòu),本質(zhì)就是字符串。類似數(shù)組,僅可設(shè)置0或1的value。
  • 主要操作
    1. 設(shè)置值 & 獲取
    - 基礎(chǔ)設(shè)置:setbit key offset value,例如需要統(tǒng)計(jì)某網(wǎng)站某天的用戶訪問情況,則使用setbit unique:users:2022-08-09 0 1 ,表示2022年8月9日uid為0的用戶訪問了該網(wǎng)站;同理,若setbit unique:users:2022-08-09 99 1則表示uid為99的用戶訪問了該網(wǎng)站。默認(rèn)情況下,value都為0。
    - 基礎(chǔ)獲取值:getbit key offset,若沿用上方案例,offset=88即為查看uid為88的用戶在當(dāng)日有無訪問該網(wǎng)站,0表示未訪問,1則是曾于今日訪問過。
    - 范圍獲取統(tǒng)計(jì):bitcount key [start end],不填寫offset則默認(rèn)全域范圍內(nèi)value=1的offset有多少個(gè)。
    2. bitmap間操作運(yùn)算
    - 交集:bitop and destkey key [key...],destkey表示操作后新產(chǎn)生的bitmap的名稱,繼續(xù)網(wǎng)站訪問案例,獲取8月8和8月9兩天都訪問的用戶數(shù)量,則進(jìn)行兩步操作:bitop and unique:users:0808+0809 unique:users:2022-08-09 unique:users:2022-08-08 & bitcount unique:users:0808+0809獲取最終結(jié)果
    - 并集:bitop or destkey key [key...],可以用統(tǒng)計(jì)兩天內(nèi)至少訪問一次該網(wǎng)站的用戶數(shù)量。
    - 非:bitop not destkey key [key...]
    - 異或:bitop xor destkey key [key...]
  • 主要功能:redis中的布隆過濾器本質(zhì)就是基于這個(gè)結(jié)構(gòu)的,利用多組hash function,在不同offset下將value從0改成1。

B. HyperLogLog

  • 概述:類似bitmaps其本質(zhì)也是字符串,利用基數(shù)算法實(shí)現(xiàn)極小內(nèi)存空間下完成獨(dú)立總數(shù)的統(tǒng)計(jì),但存在一定誤差率,官方統(tǒng)計(jì)約為0.81%。

  • 主要操作

         1. 添加:```pfadd key element [element...]```,添加成功返回1。例如```pfadd 2022-08-09:unique:ids "uuid-1" "uuid-2" "uuid-3"```。
         2. 計(jì)算:```pfcount key [key...]```,計(jì)算上方***2022-08-09:unique:ids***的數(shù)量,則使用```pfcount 2022-08-09:unique:ids```,得到結(jié)果為3。注意,**若pfadd重復(fù)的element,在使用pfcount時(shí)會(huì)自動(dòng)去重**,實(shí)現(xiàn)獨(dú)立總數(shù)統(tǒng)計(jì)的效果。
         3. 合并:```pfmerge destkey sourcekey [sourcekey...]```,使用```pfmerge 0808+0809:unique:ids 2022-08-09:unique:ids 2022-08-08:unique:ids```獲取兩天的統(tǒng)計(jì)量,再用```pfcount 0808+0809:unique:ids```獲取最終結(jié)果。
    
  • 主要功能:一般用于收集ip,email或id等,請(qǐng)參考下方實(shí)際案例

    • 若要統(tǒng)計(jì)pv,可用redis的incr或incrby實(shí)現(xiàn)

    • 但是統(tǒng)計(jì)uv的話需要篩選掉pv中重復(fù)的uid,可利用mysql的count(distinct user_id)實(shí)現(xiàn),或者redis的set,hash,bitmaps的結(jié)構(gòu)實(shí)現(xiàn);

    • 然而上方的方法效率不好,且存儲(chǔ)空間偏大,此時(shí)HyperLogLog的優(yōu)勢(shì)就出現(xiàn)了,它本身無法取出元素的值,只統(tǒng)計(jì)數(shù)量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容