互聯網上有非常多優秀成熟的開源項目,我們沒必要重復造輪子,合理的使用這些框架為我們所用,達到快速高質的完成項目目標才是我們追求的,記住他山之石可以攻玉
1.場景介紹
電商業務里經常對某些商品做促銷處理,為了查詢性能,需要定時把促銷商品的促銷信息寫入緩存
任務需求描述:
每隔2分鍾將促銷商品信息更新到Redis緩存中
2.實現方案
2.1 編寫.netcore任務代碼
新建一個.netcore控制台項目 PromoteProductCacheInfo
下面是模擬代碼
static void Main(string[] args) { Console.WriteLine("開始寫入商品促銷信息:"); var sw = new Stopwatch(); sw.Start(); int successcount = 0; //商品數量 int procount = 5; for (int i = 0;i < procount; i++) { ProtoProductCacheInfo.ProductCacheInfo product = new ProtoProductCacheInfo.ProductCacheInfo(); product.Proid = i; product.Promotetitle = "限時特惠,8折促銷"; product.Promoteprice = GetPromotePrice(100f); var isok = SaveData(product); successcount = isok ? successcount++ : successcount; Console.WriteLine("商品:" +i+ "寫入緩存" + (isok?"成功":"失敗")); } sw.Stop(); Console.WriteLine("共{0}個促銷商品,寫入成功{1}個,耗時:{1}", procount, successcount, sw.ElapsedMilliseconds); } /// <summary> /// 獲取促銷價格 /// </summary> /// <param name="price"></param> /// <returns></returns> static float GetPromotePrice(float price) { return price * 0.8f; } /// <summary> /// 寫入Redis緩存 /// </summary> /// <param name="product"></param> /// <returns></returns> static bool SaveData(ProductCacheInfo product) { string cachekey = CacheKeyprefix + product.Proid; return CodisCache.Set(cachekey, product.ToByteArray(), CacheExpireIn); }
2.2 發布上傳
我們選擇Release模式發布代碼,生成好后將 \bin\Release\netcoreapp3.1下的代碼上傳到xxl-job執行器所在的所有服務器上, 我這里是 /data/xxl-job/jobs/PromoteProductCacheInfo 目錄下
2.3 配置任務
在任務調度中心我們新建一個任務
任務描述:促銷商品信息寫入緩存
運行模式:GLUE(Shell) 。這里使用shell模式,這樣我們就可以使用shell腳本來執行我們的.netcore程序了
Cron:0 /2 * * * ? 我們可以非常方便的編寫cron表達式。
填寫完任務信息后保存,這樣我們就創建了一個定時執行的job,可以在任務管理看到我們的任務已經存在了。
2.4 編寫shell腳本
我們在任務調度中心的任務管理中找到創建的任務,點擊右邊的GLUE按鈕打開腳本編輯頁面,寫入如下代碼
#!/bin/bash cd /data/xxl-job/jobs/PromoteProductCacheInfo dotnet PromoteProductCacheInfo.dll exit 0
保存后我們的定時任務就算創建成功了,並且我們在任務的執行日志里可以看到Console.WriteLine的輸出日志
2020-09-15 10:48:34 [com.xxl.job.core.thread.JobThread#run]-[124]-[Thread-3134153] ----------- xxl-job job execute start ----------- ----------- Param: 2020-09-15 10:48:34 [com.xxl.job.core.handler.impl.ScriptJobHandler#execute]-[64]-[Thread-3134153] ----------- script file:/data/xxljob/executor/www/gluesource/459_1600073830000.sh ----------- 開始寫入商品促銷信息: 商品:1寫入緩存成功 商品:2寫入緩存成功 商品:3寫入緩存成功 商品:4寫入緩存成功 商品:5寫入緩存成功 共5個促銷商品,寫入成功5個,耗時:11 2020-09-15 10:48:34 [com.xxl.job.core.thread.JobThread#run]-[129]-[Thread-3134153] ----------- xxl-job job execute end(finish) ----------- ----------- ReturnT:ReturnT [code=200, msg=null, content=null] 2020-09-15 10:48:34 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[133]-[Thread-39] ----------- xxl-job callback success [Load Log Finish]
3. 總結
XXL-JOB是一個輕量級分布式任務調度平台,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。具體參考 xxl-job。
.NET Core 主打的是跨平台、開源、強勁性能、多樣化部署方案等,.netcore詳細介紹可以去看善友老師的博客
緩存使用谷歌protobuf協議存儲結構,方便跨平台跨語言調用