婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Redis精確去重計數方法(咆哮位圖)

Redis精確去重計數方法(咆哮位圖)

熱門標簽:臺灣電銷 高碑店市地圖標注app 400電話辦理的口碑 b2b外呼系統 南京手機外呼系統廠家 地圖標注工廠入駐 廊坊外呼系統在哪買 一個地圖標注多少錢 四川穩定外呼系統軟件

前言

如果要統計一篇文章的閱讀量,可以直接使用 Redis 的 incr 指令來完成。如果要求閱讀量必須按用戶去重,那就可以使用 set 來記錄閱讀了這篇文章的所有用戶 id,獲取 set 集合的長度就是去重閱讀量。但是如果爆款文章閱讀量太大,set 會浪費太多存儲空間。這時候我們就要使用 Redis 提供的 HyperLogLog 數據結構來代替 set,它只會占用最多 12k 的存儲空間就可以完成海量的去重統計。但是它犧牲了準確度,它是模糊計數,誤差率約為 0.81%。

那么有沒有一種不怎么浪費空間的精確計數方法呢?我們首先想到的就是位圖,可以使用位圖的一個位來表示一個用戶id。如果一個用戶id是32字節,那么使用位圖就只需要占用 1/256 的空間就可以完成精確計數。但是如何將用戶id映射到位圖的位置呢?如果用戶id是連續的整數這很好辦,但是通常用戶系統的用戶id并不是整數,而是字符串或者是有一定隨機性的大整數。

我們可以強行給每個用戶id賦予一個整數序列,然后將用戶id和整數的對應關系存在redis中。

$next_user_id = incr user_id_seq
set user_id_xxx $next_user_id
$next_user_id = incr user_id_seq
set user_id_yyy $next_user_id
$next_user_id = incr user_id_seq
set user_id_zzz $next_user_id

這里你也許會提出疑問,你說是為了節省空間,這里存儲用戶id和整數的映射關系就不浪費空間了么?這個問題提的很好,但是同時我們也要看到這個映射關系是可以復用的,它可以統計所有文章的閱讀量,還可以統計簽到用戶的日活、月活,還可以用在很多其它的需要用戶去重的統計場合中。所謂「功在當代,利在千秋」就是這個意思。

有了這個映射關系,我們就很容易構造出每一篇文章的閱讀打點位圖,來一個用戶,就將相應位圖中相應的位置為一。如果位從0變成1,那么就可以給閱讀數加1。這樣就可以很方便的獲得文章的閱讀數。

而且我們還可以動態計算閱讀了兩篇文章的公共用戶量有多少?將兩個位圖做一下 AND 計算,然后統計位圖中位 1 的個數。同樣,還可以有 OR 計算、XOR 計算等等都是可行的。

問題又來了!Redis 的位圖是密集位圖,什么意思呢?如果有一個很大的位圖,它只有最后一個位是 1,其它都是零,這個位圖還是會占用全部的內存空間,這就不是一般的浪費了。你可以想象大部分文章的閱讀量都不大,但是它們的占用空間卻是很接近的,和哪些爆款文章占據的內存差不多。

看來這個方案行不通,我們需要想想其它方案!這時咆哮位圖(RoaringBitmap)來了。

它將整個大位圖進行了分塊,如果整個塊都是零,那么這整個塊就不用存了。但是如果位1比較分散,每個塊里面都有1,雖然單個塊里的1很少,這樣只進行分塊還是不夠的,那該怎么辦呢?我們再想想,對于單個塊,是不是可以繼續優化?如果單個塊內部位 1 個數量很少,我們可以只存儲所有位1的塊內偏移量(整數),也就是存一個整數列表,那么塊內的存儲也可以降下來。這就是單個塊位圖的稀疏存儲形式 —— 存儲偏移量整數列表。只有單塊內的位1超過了一個閾值,才會一次性將稀疏存儲轉換為密集存儲。

咆哮位圖除了可以大幅節約空間之外,還會降低 AND、OR 等位運算的計算效率。以前需要計算整個位圖,現在只需要計算部分塊。如果塊內非常稀疏,那么只需要對這些小整數列表進行集合的 AND、OR 運算,如是計算量還能繼續減輕。

這里既不是用空間換時間,也沒有用時間換空間,而是用邏輯的復雜度同時換取了空間和時間。

咆哮位圖的位長最大為 2^32,對應的空間為 512M(普通位圖),位偏移被分割成高 16 位和低 16 位,高 16 位表示塊偏移,低16位表示塊內位置,單個塊可以表達 64k 的位長,也就是 8K 字節。最多會有64k個塊。現代處理器的 L1 緩存普遍要大于 8K,這樣可以保證單個塊都可以全部放入 L1 Cache,可以顯著提升性能。

如果單個塊所有的位全是零,那么它就不需要存儲。具體某個塊是否存在也可以是用位圖來表達,當塊很少時,用整數列表表示,當塊多了就可以轉換成普通位圖。整數列表占用的空間少,它還有類似于 ArrayList 的動態擴容機制避免反復擴容復制數組內容。當列表中的數字超出4096個時,會立即轉變成普通位圖。

用來表達塊是否存在的數據結構和表達單個塊數據的結構可以是同一個,因為塊是否存在本質上也是 0 和 1,就是普通的位標志。

但是 Redis 并沒有原生支持咆哮位圖這個數據結構啊?我們該如何使用呢?

Redis 確實沒有原生的,但是咆哮位圖的 Redis Module 有。

github.com/aviggiano/r…

這個項目的 star 數量并不是很多,我們來看看它的官方性能對比

OP TIME/OP (us) ST.DEV. (us)
R.SETBIT 31.89 28.49
SETBIT 29.98 29.23
R.GETBIT 29.90 14.60
GETBIT 28.63 14.58
R.BITCOUNT 32.13 0.10
BITCOUNT 192.38 0.96
R.BITPOS 70.27 0.14
BITPOS 87.70 0.62
R.BITOP NOT 156.66 3.15
BITOP NOT 364.46 5.62
R.BITOP AND 81.56 0.48
BITOP AND 492.97 8.32
R.BITOP OR 107.03 2.44
BITOP OR 461.68 8.42
R.BITOP XOR 69.07 2.82
BITOP XOR 440.75 7.90

很明顯這里對比的是稀疏位圖,只有稀疏位圖才可以呈現出這樣好看的數字。如果是密集位圖,咆哮位圖的性能肯定要稍弱于普通位圖,但是通常也不會弱太多。

下面我們來觀察一下源代碼看看它的內部結構是怎樣的

// 單個塊
typedef struct roaring_array_s {
 int32_t size;
 int32_t allocation_size;
 void **containers; // 指向整數數組或者普通位圖
 uint16_t *keys;
 uint8_t *typecodes;
 uint8_t flags;
} roaring_array_t;

// 所有塊
typedef struct roaring_bitmap_s {
 roaring_array_t high_low_container;
} roaring_bitmap_t;

很明顯可以看到塊存在與否和塊內數據都是使用同樣的數據結構表達的,它們都是 roaring_bitmap_t。這個結構里面有多種編碼形式,類型使用 typecodes 字段來表示。

#define BITSET_CONTAINER_TYPE_CODE 1
#define ARRAY_CONTAINER_TYPE_CODE 2
#define RUN_CONTAINER_TYPE_CODE 3
#define SHARED_CONTAINER_TYPE_CODE 4

看到這里的類型定義,我們發現它不止前面提到的普通位圖和數組列表兩種形式,還有 RUN 和 SHARED 這兩種類型。RUN 形式是位圖的壓縮形式,比如連續的幾個位 101,102,103,104,105,106,107,108,109 表示成 RUN 后就是 101,8(1 后面是 8 個自增的整數),這樣在空間上就可以明顯壓縮不少。在正常情況下咆哮位圖內部沒有 RUN 類型的塊。只有顯示調用了咆哮位圖的優化 API 才會轉換成 RUN 格式,這個 API 是 roaring_bitmap_run_optimize。

而 SHARED 類型用于在多個咆哮位圖之間共享塊,它還提供了寫復制功能。當這個塊被修改時將會復制出新的一份。
咆哮位圖的計算邏輯還有更多的細節,我們后面有空再繼續介紹。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 基于Redis位圖實現系統用戶登錄統計
  • PHP使用redis位圖bitMap 實現簽到功能
  • redis通過位圖法記錄在線用戶的狀態詳解
  • java redis 實現簡單的用戶簽到功能
  • 基于Redis位圖實現用戶簽到功能

標簽:泰州 甘南 畢節 定州 伊春 南寧 拉薩 河源

巨人網絡通訊聲明:本文標題《Redis精確去重計數方法(咆哮位圖)》,本文關鍵詞  Redis,精確,去重,計數,方法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis精確去重計數方法(咆哮位圖)》相關的同類信息!
  • 本頁收集關于Redis精確去重計數方法(咆哮位圖)的相關信息資訊供網民參考!
  • 推薦文章

    上一篇:Redis字符串原理的深入理解

    下一篇:Redis實戰記錄之限制操作頻率

    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91超碰这里只有精品国产| 亚洲成人综合网站| ㊣最新国产の精品bt伙计久久| 国产精品成人免费在线| 免费成人在线观看视频| 91福利区一区二区三区| 久久综合中文字幕| 日本在线观看不卡视频| 成人激情小说乱人伦| 91精品久久久久久久久99蜜臂| 国产欧美日韩久久| 精品无码三级在线观看视频| 精品一区二区三区视频在线观看| 欧美性大战久久久久久久蜜臀| 久久这里只有精品首页| 亚洲成人av中文| 99在线热播精品免费| 久久综合久久99| 精品亚洲国产成人av制服丝袜| 91精品福利在线一区二区三区 | 在线观看免费成人| 成人免费小视频| 91理论电影在线观看| 亚洲欧美日韩在线| 99精品久久只有精品| 国产精品日韩成人| 国产91精品一区二区| 久久嫩草精品久久久久| 国产一区视频导航| 自拍偷拍国产精品| 色婷婷国产精品| 精品久久久久久最新网址| 日本黄色一区二区| 狠狠色丁香婷综合久久| 91官网在线免费观看| 中文字幕一区二区不卡| 国产99精品视频| 精品成a人在线观看| 亚洲狠狠丁香婷婷综合久久久| 国产亚洲污的网站| 国产成人精品aa毛片| 国产精品久久久久影院亚瑟 | 国产黄色成人av| 国产女同互慰高潮91漫画| 日日夜夜免费精品| 制服.丝袜.亚洲.中文.综合| 亚洲一区在线观看免费观看电影高清| 国产呦精品一区二区三区网站| 亚洲精品在线观看视频| 偷拍一区二区三区四区| 欧美日韩另类一区| 亚洲午夜免费电影| 美女脱光内衣内裤视频久久网站 | 成人免费看片app下载| 国产精品乱码一区二三区小蝌蚪| 9l国产精品久久久久麻豆| 一级特黄大欧美久久久| 国产黄人亚洲片| 一区二区在线观看不卡| 91美女片黄在线观看| 欧美中文字幕一区二区三区 | 不卡区在线中文字幕| 亚洲电影视频在线| 在线一区二区观看| 久久精品国产精品亚洲综合| 国产精品天干天干在线综合| 欧美日韩激情一区二区三区| 国产乱码精品一区二区三| 亚洲色图.com| 26uuu久久天堂性欧美| 色婷婷综合久久久久中文 | 成人动漫一区二区| 亚洲午夜久久久久久久久电影网| 日韩丝袜情趣美女图片| 97久久精品人人澡人人爽| 麻豆视频观看网址久久| 亚洲图片自拍偷拍| 国产精品国产精品国产专区不蜜 | 成人一区二区视频| 免费久久99精品国产| 中文字幕av资源一区| 精品国产精品网麻豆系列| 色狠狠色噜噜噜综合网| 91在线你懂得| 欧美一区二区三区在| 中文字幕免费不卡在线| 免费观看一级特黄欧美大片| 91蜜桃传媒精品久久久一区二区| 日韩一区二区三区免费看| 一二三区精品视频| 91婷婷韩国欧美一区二区| 久久婷婷色综合| 久久精品国产精品亚洲红杏| 欧美久久久一区| 亚洲风情在线资源站| 91在线视频免费观看| 亚洲欧洲av在线| 99在线精品视频| 日韩美女精品在线| 99天天综合性| 一区二区三区成人| 欧美在线免费观看视频| 亚洲成人三级小说| 欧美日韩视频在线第一区 | 一区视频在线播放| 不卡欧美aaaaa| 亚洲免费在线观看视频| 在线观看91精品国产入口| 亚洲午夜一区二区| 91精品国产欧美一区二区18| 极品少妇一区二区| 国产精品久久一级| 欧美唯美清纯偷拍| 午夜精品福利视频网站| 精品国产乱码久久久久久牛牛| 国产一区二区中文字幕| 国产精品久久三区| 欧美日韩一区二区三区在线 | 成人精品视频一区| 亚洲综合网站在线观看| 日韩一区二区免费高清| 国产高清在线精品| 亚洲一区二区在线观看视频| 欧美日韩午夜在线视频| 国产大片一区二区| 亚洲综合偷拍欧美一区色| 欧美一区二区三区小说| 国产传媒一区在线| 亚洲高清免费观看 | 日韩成人午夜精品| 国产色一区二区| 欧美日韩综合色| 国精产品一区一区三区mba桃花| 国产精品激情偷乱一区二区∴| 欧美综合欧美视频| 国产福利一区二区| 亚洲一区日韩精品中文字幕| 久久久久青草大香线综合精品| 色婷婷综合中文久久一本| 久久99精品一区二区三区三区| 亚洲欧美另类小说| 久久久午夜精品理论片中文字幕| 色诱视频网站一区| 国产精品主播直播| 视频在线观看一区| 久久综合久久久久88| 欧美亚洲国产bt| 国产一区视频导航| 亚洲电影你懂得| 亚洲三级免费电影| 日韩视频在线永久播放| 色呦呦国产精品| 国产成都精品91一区二区三 | 国产精品久久久久精k8| 51精品国自产在线| 99国产一区二区三精品乱码| 老司机精品视频一区二区三区| 亚洲国产精品视频| 国产精品欧美久久久久无广告| 日韩欧美国产综合| 在线不卡中文字幕| 欧美写真视频网站| 91免费国产在线观看| 国模娜娜一区二区三区| 日本欧美在线观看| 亚洲国产欧美日韩另类综合 | 欧美一区二区三区精品| 在线免费亚洲电影| 成人在线视频一区二区| 日韩成人伦理电影在线观看| 亚洲欧洲韩国日本视频| 国产欧美精品一区二区三区四区| 欧美一区二区三区在线| 91麻豆精品久久久久蜜臀| 在线观看视频一区二区欧美日韩| 成人av免费在线观看| 极品少妇xxxx精品少妇| 香蕉加勒比综合久久| 亚洲国产精品一区二区久久| 国产精品网曝门| 日韩三级视频在线看| 91精品福利在线| 欧洲一区在线电影| 欧美精品aⅴ在线视频| 欧美午夜电影网| 欧美日韩一区二区三区四区| 欧洲一区二区av| 欧美日韩视频在线观看一区二区三区 | 亚洲一区中文在线| 亚洲国产日韩av| 日韩中文字幕av电影| 免费高清不卡av| 国产精一品亚洲二区在线视频| 国产精品99久久久久久久女警| 国产成人免费高清| 色吊一区二区三区| 日韩一区二区精品葵司在线| 国产亚洲人成网站| 亚洲色欲色欲www在线观看| 亚洲综合区在线|