redis實現(xiàn)高并發(fā)計數(shù)

redis實現(xiàn)高并發(fā)計數(shù)

業(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()+"&amp;"+userId+"&amp;"+"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; 	} }	

更多redis知識請關(guān)注redis入門教程欄目。

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊12 分享