redis排重 利用redis實現大資料量去重演算法

2021-10-13 07:06:33 字數 2106 閱讀 2299

應用場景復現:

某服務商有數千萬使用者,要有計畫的給使用者手機傳送營銷簡訊。服務商的使用者是在不斷變化的,每次傳送的使用者是從總量中按指定條件的使用者畫像進行篩選的

乙個使用者乙個月內只允許收到一條營銷簡訊

每次傳送營銷簡訊前要能較精確的統計出可傳送到的使用者數量

運營提供的手機號清單禁止傳送

採用redis set資料型別程式業務設計:每次待傳送使用者從庫中匯入redis set1

每天已傳送的使用者計入set2,set2按日期命名方便後續程式設計計算,如set20191010、set20191011

準備傳送時將篩選的使用者set1與最近30天的set2進行去重操作並寫入set3

然後按set3的資料分頁讀取並傳送,或者每次取固定條數傳送並刪除

採用redis bitmap資料型別程式業務設計:方案與set資料型別類似,主要是bitmap整體儲存空間更小,但需要考慮其效能和32位int範圍可支援的資料量,非數字型的資料無法使用

redis裡bitmap實際是乙個不超過512m的字串,因此會變成乙個大key操作

假設當前站點有5000w使用者,那麼一天的資料大約為50000000 / 8 / 1024 / 1 024 = 6mb

步驟一 將原始資料寫入 key1

for $i

setbit key1 $i 1

end步驟二 將去重資料寫入 key 2

for $i

setbit key2 $i 1

end步驟三 key1 與 key2 去重得出 key3

bitop not key3 key1

bitop or key4 key3 key2

bitop not key5 key4

其中 key5就是我們需要的排重後的資料

$redis = new redis();

$redis->connect('127.0.0.1', 6379);

$redis->select(0);

$sendcache = 'sendlist';

$redis->setbit($sendcache, 10, 1);

$redis->setbit($sendcache, 11, 1);

$redis->setbit($sendcache, 12, 1);

$redis->setbit($sendcache, 102, 1);

$sendedcache = 'sendedlist';

$redis->setbit($sendedcache, 11, 1);

$redis->setbit($sendedcache, 12, 1);

$redis->setbit($sendedcache, 13, 1);

$redis->setbit($sendedcache, 105, 1);

$sendlist = $redis->get($sendcache);

$sendedlist = $redis->get($sendedcache);

$sendlist = unpack('c*', $sendlist);

$sendedlist = unpack('c*', $sendedlist);

$count = 0;

$arr = ;

$n=0;

foreach($sendlist as $key => $number) {

$sendednumber = $sendedlist[$key];

for($i = 0; $i < 8; $i++) {

if(($number >> $i & 1) == 1) {

if (($number >> $i & (~($sendednumber >> $i))) == 1) {

$count++;

$arr[$n+7-$i] = 1;

$n += 8;

print_r($arr);

die;

實際驗證是可行的,但是要注意 userid 的最大位數,盡量不要超過7位,不然會有很大的效能問題

下邊兩組資料測試資料,乙個7位的userid,get 最大需要花費17s,乙個8位的userid,get 最大需要花費170s

9999999 17.77s

99999999 170.57s

redis備份實操

終於發布了個人的第乙個課程 redis備份實操,位址 1 不能搞出問題 虛擬機器測試環境不擔心這個啊 2 任務得在夜間進行 白天業務高峰期,不適合做維護 3 必須考慮可用性,得把資料備份到其他的系統上。我的搞法是 1 準備乙個資料校驗環境,安裝上redis,用於備份檔案匯入。通過對比生產環境redi...

redis備份實操

終於發布了個人的第乙個課程 redis備份實操,位址 1 不能搞出問題 虛擬機器測試環境不擔心這個啊 2 任務得在夜間進行 白天業務高峰期,不適合做維護 3 必須考慮可用性,得把資料備份到其他的系統上。我的搞法是 1 準備乙個資料校驗環境,安裝上redis,用於備份檔案匯入。通過對比生產環境redi...

redis執行緒阻塞原因排插 Redis 阻塞原因

1.內因 a.api或資料結構使用不合理 如 對乙個包含上萬元素的hash結構執行hgetall操作,資料量大且命令複雜度o n 必然阻塞 b.慢查詢 前面有介紹 c.大物件 執行.redis cli h p bigkeys命令可找出當前最大物件出來,接著便可對大物件進行調整或縮減或分成多個小物件 ...