大資料量定時超時 精確到秒

2021-10-08 16:33:10 字數 2447 閱讀 6407

開發過程中或多或少會遇到某些場景,要求資料在規定的時間內如果沒處理就要失效掉;

如:使用者下單,訂單在30分鐘內沒支付就要自動取消,防止長時間占用庫存等;

面對這種情況我們來扒拉一下:

系統啟乙個定時任務,定時掃庫,取出超過30分鐘的資料,取消釋放庫存

使用者下單後將訂單放入mq的延遲佇列(比如rocketmq的延遲訊息),依賴於mq的通知實時觸發取消

將資料放入redis,定時掃瞄redis

將資料放入收尾相連的環形鏈路中,依次觸發超時

1、定時任務掃庫

在分布式定時任務系統中啟動乙個定時任務,定時任務時間可根據實際業務定義(1分鐘、5分鐘)

存在問題:

如果是單庫:通常資料量比較多,如果每秒掃瞄可能比較耗資源,往往是每分鐘或、、、超時有誤差

如果是分庫分表:需要掃瞄全量庫表,

好處:實現相對簡單,就是一次普通的查詢

資料量少的情況下可以使用,注意查詢條件要配以索引,否則會非常慢

2、依賴mq的延遲佇列實現

以rocketmq為例:

當producer端傳送延遲訊息時,broker會建立乙個schedule_topic*開頭的topic,然後以該topic持久化

然後給每個topic啟動定時任務掃瞄,將資料放入真正的topic推送到consumer端消費

存在問題:放入mq的訊息是按照fifo(先進先出的原則),如果傳送的訊息超時時間比後面傳送的超時時間長那麼後面可能遲遲得不到消費

3、基於redis定時--全量掃瞄實現

這種實現跟第一種基於資料庫基本類似,就是將資料庫換成redis

存在問題:每次都是全量資料拉取,如果資料量過大會這種資源占用,再說redis單執行緒處理,要防止過大資料拉取

4、基於redis--將資料放入list資料結構

放資料的時候使用rightpush函式從右測逐個放入

啟動定時任務(每秒)取(index(0)函式)list第乙個,判斷是否超時

如果沒超時:結束本次

如果超時:獲取前100個(按業務自定義數量)判斷是否超時,如果全部超時再取100判斷,如果迴圈遇到未超時的結束本次,並將超時的從reids刪除leftpop()

好處:相對上種來說,避免了全量拉取資料

存在問題:可能出現多次網路互動,每次拉取數量要按照自己業務來調整

5、基於redis--將資料存入map

本地啟動乙個定時任務(每秒),redis維護乙個變數

訂單入庫時:先取reids裡的變數,然後以該變數命名新建map,將資料放入map

每跑一次定時任務變數++,然後拉取該map下的訂單,判斷超時的對應刪除

變數==到達(超時時間秒數)個數時,將變數賦值1

這樣就生成了乙個收尾相連的環形list

好處:資料精確到秒級失效,每次從redis拉取的資料最多是2秒內的資料,資料量可空

存在問題:如果超時時間相對較長,redis裡將建立過多的map

針對第5種實現

1、訂單進入時的操作

private static final string annular_num ="order:index_num";

public void annularadd(string orderno)

}

查詢reids自增變數,如果不為空就將訂單放入對應的map

2、啟動定時任務(每秒)

private static final string annular_num ="order:index_num";

public void annularaddschedule() else

system.out.println("當前map"+increment);

map map = redistemplate.opsforhash().entries("order:map:" + increment);

listorders = new arraylist<>();

long timeout = localdatetime.now().plusseconds(-119).toinstant(zoneoffset.of("+8")).toepochmilli();

map.foreach((key, value) ->

});system.out.println("超時的orders*****====" + orders.size());

大資料量演算法

給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 位圖思想解法 include stdio.h include stdlib.h include memory.h define max num 4294967295 int mai...

大資料量處理

看看這個,異曲同工,永遠不超時 該程式是針對非常龐大的資料庫開發的,沒有用迴圈 用途 對過萬條資料的資料庫字段內容批量替換 資料庫連線 dim beeyee dbname,connstr,conn,intsn1 dim content,num,intsn,intidno,strcodea,strco...

航測大資料量處理 大資料量處理及優化措施

1 首先考慮垂直拆分庫,不同的表拆分到不同的庫中,例如使用者庫 產品庫 支付庫 2 然後考慮水平拆分庫,將乙個表的資料放到多張表中,例如按照使用者 時間 訂單號 3 插入資料的時候不建立索引 4 待資料已經插入完成後,建立索引 5 正確的指定索引字段 6 使用批量插入資料庫的方式代替單條資料的插入 ...