業(yè)務(wù)需求中經(jīng)常有需要用到計數(shù)器的場景:譬如一個手機號一天限制發(fā)送5條短信、一個接口一分鐘限制多少請求、一個接口一天限制調(diào)用多少次等等。使用redis的Incr自增命令可以輕松實現(xiàn)以上需求。以一個接口一天限制調(diào)用次數(shù)為例:
/** ?*?是否拒絕服務(wù) ?*?@return ?*/ private?boolean?denialOfService(String?userId){ long?count=JedisUtil.setIncr(DateUtil.getDate()+"&"+userId+"&"+"queryCarViolation",?86400); if(count<pre class="brush:php;toolbar:false">???????/** ?*?查詢違章 ?*?@param?plateNumber車牌 ?*?@param?vin?車架號 ?*?@param?engineNo發(fā)動機 ?*?@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; ????} //沒超過限制,業(yè)務(wù)邏輯…… ?}
每次調(diào)用接口之前,先獲得下計數(shù)器自增后的值,如果小于限制,放行,執(zhí)行后面的代碼。如果大于限制,則攔截掉。
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; } }
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END
喜歡就支持一下吧
相關(guān)推薦