一:背景
專案中碰到簡訊閘道器有個問題:務需求是需要限制乙個號碼一分鐘內只能獲取一次隨機碼,之前的實現是簡訊傳送請求過來後,先去
資料庫查詢傳送記錄,根據上一次的簡訊傳送時間和當前時間比較,如果時間差小於一分鐘,則提示簡訊獲取頻繁,如果超過一分鐘,則傳送簡訊,並記錄簡訊傳送日誌。
這樣的操作其實是有問題的。當同一時間有很多請求過來時,同時去查庫,同時獲取到上一次傳送時間,有可能就會重**送簡訊了。
二:修改改造
1.用redis解決
redis
incr 可以實現原子性的遞增
,可應用於高併發的秒殺活動、分布式序列號生成等場景。這裡我使用它來計數實現一分鐘內只接受一次請求。
我們在後台接到簡訊傳送請求後,使用redis的incr設定乙個遞增key(key由固定字串+手機號碼組成),並判斷該key的數值,如果等於1,說明是第乙個請求,我們將該key值有效期設定為一分鐘;如果該key的數值大於1,說明是1分鐘內的多次請求,這時我們直接返回簡訊獲取頻繁,**如下:
string rediskey = "sms_limit_" + smsphone;long
count = redistemplate.opsforvalue().increment(rediskey
, 1);
if (count == 1)
if (count > 1)
/** 傳送簡訊 */
......
/** 記錄傳送日誌 */
MQ 的使用場景 一)
一 訊息佇列概述 訊息佇列中介軟體是分布式系統中重要的元件,主要解決應用解耦,非同步訊息,流量削鋒等問題,實現高效能,高可用,可伸縮和最終一致性架構。目前使用較多的訊息佇列有activemq,rabbitmq,zeromq,kafka,metamq,rocketmq 二 訊息佇列應用場景 以下介紹訊...
使用AfxGetMainWnd函式的乙個心得
使用afxgetmainwnd函式獲取mfc程式中的主框架類指標是乙個常用作法。但是你會發現這一做法有時也會失靈。不信,你測試一下下面的 執行ontest1函式,你會發現客戶區並沒有列印 來自執行緒的字串 下面我們把執行緒函式變一下 執行ontest1函式,我們發現檢視客戶區出現了 來自執行緒的字串...
libcurl 使用的乙個錯誤
作者 yu tao 關鍵字 libcurl,liboauth,kpfs,longjmp chk,curlopt nosignal 近來遇到乙個 libcurl crash 的問題,這裡記錄一下。出錯的 log longjmp causes uninitialized stack frame kpfs...