Redis 位圖基礎(chǔ)到統(tǒng)計活躍用戶

前言

大家有沒有想過如何統(tǒng)計活躍用戶數(shù)量?如果是自己做煤杀,那該怎么做诀紊?

這里思考一分鐘谒出,后面我將分享一下如何使用 redis 中的位圖來統(tǒng)計活躍用戶數(shù)。

正文

什么是位圖 邻奠?

位圖(bitmap) 是二進(jìn)制的 byte 數(shù)組笤喳,也可以簡單理解成是一個普通字符串。它將二進(jìn)制數(shù)據(jù)存儲在 byte 數(shù)組中以達(dá)到存儲數(shù)據(jù)的作用碌宴。

圖 1.1

如何使用位圖 杀狡?

理清概念

在解釋什么是位圖的時候說過,位圖可以理解成是一個普通字符串贰镣,那么我們?yōu)槭裁匆梦粓D而不是字符串呢 呜象?

下面是在 redis 中存儲字符串的一個示意圖


圖 2.1

![setbit.png](https://upload-images.jianshu.io/upload_images/14961694-3ecf37534fa88624.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

如圖,存儲字符串是將字符串二進(jìn)制數(shù)組的形式存儲在 redis 中八孝,位圖可以直接對 二進(jìn)制的數(shù)組操作董朝,位圖的優(yōu)勢在于可以用 0 和 1來存儲布爾值,這大大降低了我們的存儲空間消耗干跛。由于這個特性子姜,我們用位圖來記錄簽到信息,記錄活躍用戶等楼入,可以達(dá)到節(jié)省空間的能力(后面會有介紹)哥捕。

那我們?nèi)绾螌ΧM(jìn)制的數(shù)組進(jìn)行操作呢?

基本存取

setbit | getbit

上文說的二進(jìn)制數(shù)組我們可以對它做添加嘉熊、查找及修改的功能

如何進(jìn)行添加和查找呢?

setbit [keyName] [offset] [value]

offset:偏移量遥赚,指的是數(shù)組的下標(biāo); value: 數(shù)據(jù)阐肤, 只能是 0 和 1凫佛。

這條命令既可以添加數(shù)據(jù)也可以修改數(shù)據(jù)讲坎。

如何進(jìn)行查找呢 ?

getbit [keyName] [offset]

offset:偏移量愧薛,指的是數(shù)組的下標(biāo)晨炕。這里,除了設(shè)置 value 為 1 的 offset, 查詢其他的都返回 0

補充:上面說了位圖可以理解成字符串毫炉,那么它們之間可以互相操作嗎瓮栗?

圖 2.2

請對照上圖,我們一起完成下面的探究:

  1. 以字符串存儲,可以通過 getbit 命令獲取到值嗎?

    我們可以結(jié)合查詢和圖片所示的 offset 及所對應(yīng)的值來驗證

    > set str hi
    OK
    
    > getbit str 0
    (integer) 0
    
    > getbit str 4
    (integer) 1
    
    > getbit str 7
    (integer) 0
    
    > getbit str 15
    (integer) 1
    

    結(jié)論:可以的

  2. 以字符串存儲憋他,可以通過 settbit 修改值嗎?

    我們可以試著將 offset 7 對應(yīng)的 value 改成 1愿阐, 如果成功了,h 字符應(yīng)該變成 i

    > setbit str 7 1
    (integer) 0
    
    > get str
    "ii"
    

    結(jié)論:可以

  3. setbit 存儲字符串的二進(jìn)制數(shù)據(jù)趾疚,可以通過 get 獲取字符串嗎换况?

    我們將 字符 h 的二進(jìn)制存入位圖,看可以能通過 get 獲取

    > setbit bitmap 0 0
    (integer) 0
    > setbit bitmap 1 1
    (integer) 0
    > setbit bitmap 2 1
    (integer) 0
    > setbit bitmap 3 0
    (integer) 0
    > setbit bitmap 4 1
    (integer) 0
    > setbit bitmap 5 0
    (integer) 0
    > setbit bitmap 6 0
    (integer) 0
    > setbit bitmap 7 0
    (integer) 0
    > get bitmap
    "h"
    

    結(jié)論:可以

上面介紹了位圖的基本概念和使用盗蟆,通過一系列的探究希望能幫助大家更好的理解位圖

那么戈二,如何將位圖應(yīng)用的項目中呢?

統(tǒng)計和查找

bitcount | bitpos

bitcount 是用來查找 1 出現(xiàn)的次數(shù)喳资,既可以對位圖使用也可以對字符串使用觉吭,用法如下:

bitcount [keyName] [startWith] [endWith]

注意:這里的 startWith 和 endWith 不是二進(jìn)制數(shù)組的下標(biāo)(offset)

這里的 startWith 和 endWith 可以理解成是字符串的下標(biāo),一個字符串對應(yīng) 8 位二進(jìn)制數(shù)據(jù)仆邓;它們相當(dāng)于是截取字符串鲜滩,如 s= "hi", s[0:0] = "h", 它所對應(yīng)的二進(jìn)制數(shù)組的下標(biāo)是 0,7节值,以此類推徙硅。

其實這里不好解釋,先來帶代碼搞疗,可以結(jié)合著上面的 圖 2.2 看一下嗓蘑,大家后面可以在領(lǐng)悟一下

> set str hi
> bitcount str 0 0
(integer) 4
> bitcount str 0 1
(integer) 8
> bitcount str
(integer) 8

注意:startWith 和 endWith 不設(shè)置的時候默認(rèn)全部范圍

應(yīng)用場景:統(tǒng)計活躍用戶的數(shù)量

bitpos用來查找指定范圍內(nèi)出現(xiàn)的第一個 0 或 1,用法如下:

bitpos [keyName] [bit] [start] [end]

bit: 要找的 0 或者 1匿乃, start 和 end 同上面的 startWith 和 endWith

應(yīng)用場景:獲取第一次簽到和第一次未簽到的時間

應(yīng)用場景

上面大致說了 2 個應(yīng)用場景:

  1. 統(tǒng)計活躍用戶的數(shù)量
  2. 獲取第一次簽到和第一次未簽到的時間

我在這里稍微介紹一下思路桩皿,然后附上一個 統(tǒng)計活躍用戶的數(shù)量 可供參考

統(tǒng)計活躍用戶的數(shù)量

  1. 將位圖的 keyName 設(shè)置成需要統(tǒng)計的 行為和時間范圍 [ation:date], 如:login:2020-3
  2. 將用戶對應(yīng)到位圖中的 offset, 如 id 對應(yīng)二進(jìn)制數(shù)組的下標(biāo),idint
  3. 簽到成功使用 setbit 將對應(yīng)的offset 設(shè)置成 1
  4. 使用 bitcount 統(tǒng)計某個行為和時間范圍的活躍人數(shù)幢炸,如 bitcount login:2020-3

Demo: DailyActiveUsers

獲取第一次簽到和第一次未簽到的時間

  1. 將位圖的 keyName 設(shè)置成需要統(tǒng)計的 行為和時間范圍和對象 [ation: date:person], 如:login:2020-3:Tom
  2. 將日期對應(yīng)到位圖中的 offset, 如 1號對應(yīng)二進(jìn)制數(shù)組的下標(biāo) 0泄隔, 2 號為 1
  3. 簽到成功使用 setbit 將對應(yīng)的offset 設(shè)置成 1
  4. 使用 bitpos 統(tǒng)計某個行為和時間范圍和對象的簽到情況,如 bitpos login:2020-3:Tom 1

總結(jié)

  1. 位圖和字符串沒有本質(zhì)上的區(qū)別宛徊,只是操作方式不同
  2. 使用位圖存儲布爾數(shù)據(jù)可以大大節(jié)省空間
  3. 存取命令 setbit/getbit
  4. 統(tǒng)計查找 bitcount / bitpos

最后

上述內(nèi)容對大家有所幫助的話佛嬉,請幫我 點個贊??逻澳,分享不易,感謝支持暖呕!

如果本文有任何錯誤赡盘,感謝各位批評指教 !

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缰揪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葱淳,更是在濱河造成了極大的恐慌钝腺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赞厕,死亡現(xiàn)場離奇詭異艳狐,居然都是意外死亡,警方通過查閱死者的電腦和手機皿桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門毫目,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诲侮,你說我怎么就攤上這事镀虐。” “怎么了沟绪?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵刮便,是天一觀的道長。 經(jīng)常有香客問我绽慈,道長恨旱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任坝疼,我火速辦了婚禮搜贤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钝凶。我一直安慰自己仪芒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布耕陷。 她就那樣靜靜地躺著桌硫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啃炸。 梳的紋絲不亂的頭發(fā)上铆隘,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音南用,去河邊找鬼膀钠。 笑死掏湾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肿嘲。 我是一名探鬼主播融击,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雳窟!你這毒婦竟也來了尊浪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤封救,失蹤者是張志新(化名)和其女友劉穎拇涤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誉结,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡鹅士,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惩坑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掉盅。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖以舒,靈堂內(nèi)的尸體忽然破棺而出趾痘,到底是詐尸還是另有隱情,我是刑警寧澤蔓钟,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布扼脐,位于F島的核電站,受9級特大地震影響奋刽,放射性物質(zhì)發(fā)生泄漏瓦侮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一佣谐、第九天 我趴在偏房一處隱蔽的房頂上張望肚吏。 院中可真熱鬧,春花似錦狭魂、人聲如沸罚攀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋泄。三九已至,卻和暖如春镐牺,著一層夾襖步出監(jiān)牢的瞬間炫掐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工睬涧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留募胃,地道東北人旗唁。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像痹束,于是被迫代替她去往敵國和親检疫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一億個用戶祷嘶,有的用戶頻繁登錄屎媳,也有不經(jīng)常登錄的。如何記錄用戶的登錄信息论巍?如何查詢活躍用戶烛谊?[如一周內(nèi) 登錄三次的]...
    小胖學(xué)編程閱讀 8,575評論 0 12
  • 基本的Redis key的操作都已經(jīng)熟悉了之后,便可以開始針對Redis提供的各種可操作的數(shù)據(jù)結(jié)構(gòu)進(jìn)行學(xué)習(xí)和了解环壤。...
    Yorking閱讀 859評論 0 0
  • 什么是位圖 位圖(Bitmap)是通過一個 bit 來表示某個元素對應(yīng)的值或者狀態(tài)。它并不是什么新的數(shù)據(jù)結(jié)構(gòu)钞诡。它的...
    youthcity閱讀 2,047評論 1 51
  • 一郑现、大家覺得在PPT中什么樣的表格樣式才算美觀大方、重點突出荧降。 二接箫、美化表格四步驟如下: 001.去除格式 002...
    E15期4隊一五彩云一萬州閱讀 151評論 0 1
  • #八歲日記#略凌亂~ 繼我回京一周后,老媽也結(jié)束了二十多天的杭州之行朵诫,啟程回家~昨天閑來無事一起翻看照片辛友,又讓我想...
    妖八歲閱讀 235評論 0 0