利用Redis實現高併發計數器
業務需求中經常有需要用到計數器的場景:譬如一個手機號一天限制傳送5條簡訊、一個介面一分鐘限制多少請求、一個介面一天限制呼叫多少次等等。使用Redis的Incr自增命令可以輕鬆實現以上需求。以一個介面一天限制呼叫次數為例:
/**
* 是否拒絕服務
* @return
*/
private boolean denialOfService(String userId){
long count=JedisUtil.setIncr(DateUtil.getDate()+"&"+userId+"&"+"queryCarViolation", 86400);
if(count<=10){
return false;
}
return true;
}
/**
* 查詢違章
* @param plateNumber車牌
* @param vin 車架號
* @param engineNo發動機
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("/queryCarViolationList.json")
@AuthorizationApi
public void queryCarViolationList(@CurrentToken Token token,String plateNumber,String vin,
String engineNo,HttpServletRequest request,HttpServletResponse response) throws Exception {
String userId=token.getUserId();
//超過限制,攔截請求
if(denialOfService(userId)){
apiData(request, response, ReqJson.error(CarError.ONLY_5_TIMES_A_DAY_CAN_BE_FOUND));
return;
}
//沒超過限制,業務邏輯……
}
每次呼叫介面之前,先獲得下計數器自增後的值,如果小於限制,放行,執行後面的程式碼。如果大於限制,則攔截掉。
JedisUtil工具類:
public class JedisUtil {
protected final static Logger logger = Logger.getLogger(JedisUtil.class);
private static JedisPool jedisPool;
@Autowired(required = true)
public void setJedisPool(JedisPool jedisPool) {
JedisUtil.jedisPool = jedisPool;
}
/**
* 對某個鍵的值自增
* @author liboyi
* @param key 鍵
* @param cacheSeconds 超時時間,0為不超時
* @return
*/
public static long setIncr(String key, int cacheSeconds) {
long result = 0;
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
result =jedis.incr(key);
if (cacheSeconds != 0) {
jedis.expire(key, cacheSeconds);
}
logger.debug("set "+ key + " = " + result);
} catch (Exception e) {
logger.warn("set "+ key + " = " + result);
} finally {
jedisPool.returnResource(jedis);
}
return result;
}
}
原文:https://blog.csdn.net/qq_33556185/article/details/79427271
版權宣告:本文為博主原創文章,轉載請附上博文連結!
相關文章
- 實現高效能高併發的計數器功能
- 計數器方式實現非同步併發非同步
- php利用pcntl擴充套件實現高併發PHP套件
- 用PHP實現高併發伺服器PHP伺服器
- Redis 實現高併發下的搶購 / 秒殺功能Redis
- Redis-高併發篇Redis
- Redis如何防止高併發?Redis
- 線上Redis高併發效能調優實踐Redis
- Redis實現併發阻塞鎖方案Redis
- 如何利用sockserver模組程式設計實現客戶端併發Server程式設計客戶端
- django框架怎麼實現高併發Django框架
- Nginx 實現高併發的原理分析Nginx
- 如何實現Redis裡的自增ID計數器Redis
- Golang的滑動視窗計數器Redis限速實現GolangRedis
- redis之字串型別(string)--計數器實現Redis字串型別
- 【Redis】利用 Redis 實現分散式鎖Redis分散式
- TCP併發伺服器的程式設計實現TCP伺服器程式設計
- PHP利用Mysql鎖解決高併發PHPMySql
- 如何快速實現高併發短文檢索
- PHP利用Redis鎖解決併發訪問PHPRedis
- 高併發文章瀏覽量計數系統設計
- 如何利用 Redis 快速實現簽到統計功能Redis
- nginx 高併發配置引數Nginx
- 利用 C++ 11 特性實現多執行緒計數器C++執行緒
- Redis應用一例(存證數量用計數器實現)Redis
- 利用Redis實現分散式鎖Redis分散式
- 【計算機內功心法】七:高併發高效能伺服器是如何實現的計算機伺服器
- 如何利用 Seaborn 實現高階統計圖表
- 關於Redis的幾件小事 | 高併發和高可用Redis
- 關於redis的幾件小事(五)redis保證高併發以及高可用Redis
- 【高併發】Redis如何助力高併發秒殺系統,看完這篇我徹底懂了!!Redis
- 必殺器!鵝廠首推569頁Netty+Redis+ZK+高併發NettyRedis
- Redis | 第7章 Redis 伺服器《Redis設計與實現》Redis伺服器
- 高併發設計筆記筆記
- 如何設計高併發介面?
- 常用高併發網路執行緒模型效能優化實現-體驗百萬級高併發執行緒模型設計執行緒模型優化
- 利用MongoDB的SplitVector命令實現併發資料遷移MongoDB
- Java ConcurrentHashMap 高併發安全實現原理解析JavaHashMap