應用場景復現:
某服務商有數千萬使用者,要有計畫的給使用者手機傳送營銷簡訊。服務商的使用者是在不斷變化的,每次傳送的使用者是從總量中按指定條件的使用者畫像進行篩選的
乙個使用者乙個月內只允許收到一條營銷簡訊
每次傳送營銷簡訊前要能較精確的統計出可傳送到的使用者數量
運營提供的手機號清單禁止傳送
採用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命令可找出當前最大物件出來,接著便可對大物件進行調整或縮減或分成多個小物件 ...