佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器

Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器

熱門標(biāo)簽:呼叫中心市場(chǎng)需求 鐵路電話系統(tǒng) 百度競(jìng)價(jià)排名 服務(wù)外包 網(wǎng)站排名優(yōu)化 地方門戶網(wǎng)站 AI電銷 Linux服務(wù)器

業(yè)務(wù)需求中經(jīng)常有需要用到計(jì)數(shù)器的場(chǎng)景:譬如一個(gè)手機(jī)號(hào)一天限制發(fā)送5條短信、一個(gè)接口一分鐘限制多少請(qǐng)求、一個(gè)接口一天限制調(diào)用多少次等等。使用Redis的Incr自增命令可以輕松實(shí)現(xiàn)以上需求。以一個(gè)接口一天限制調(diào)用次數(shù)為例:

 /**
 * 是否拒絕服務(wù)
 * @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 車架號(hào)
 * @param engineNo發(fā)動(dòng)機(jī)
 * @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();
      //超過(guò)限制,攔截請(qǐng)求
   if(denialOfService(userId)){
  apiData(request, response, ReqJson.error(CarError.ONLY_5_TIMES_A_DAY_CAN_BE_FOUND));
  return;
   }
 //沒(méi)超過(guò)限制,業(yè)務(wù)邏輯……
 }

每次調(diào)用接口之前,先獲得下計(jì)數(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;
 }
 /**
 * 對(duì)某個(gè)鍵的值自增
 * @author liboyi
 * @param key 鍵
 * @param cacheSeconds 超時(shí)時(shí)間,0為不超時(shí)
 * @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;
 }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 詳解利用redis + lua解決搶紅包高并發(fā)的問(wèn)題
  • Nginx+Lua+Redis構(gòu)建高并發(fā)Web應(yīng)用
  • 如何利用Redis鎖解決高并發(fā)問(wèn)題詳解
  • Redis瞬時(shí)高并發(fā)秒殺方案總結(jié)
  • PHP實(shí)現(xiàn)Redis單據(jù)鎖以及防止并發(fā)重復(fù)寫入
  • jedispool連redis高并發(fā)卡死的問(wèn)題
  • 使用lua+redis解決發(fā)多張券的并發(fā)問(wèn)題

標(biāo)簽:仙桃 衡水 蘭州 湖南 崇左 黃山 湘潭 銅川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    营山县| 南阳市| 黔江区| 万州区| 万山特区| 高州市| 五原县| 五台县| 宜州市| 铁岭市| 小金县| 广河县| 陈巴尔虎旗| 顺昌县| 凤台县| 湟源县| 达州市| 日喀则市| 汾阳市| 昭苏县| 延长县| 太保市| 贵定县| 崇州市| 安顺市| 海林市| 镇宁| 佛冈县| 西乌珠穆沁旗| 萍乡市| 正镶白旗| 土默特右旗| 台安县| 博客| 监利县| 建宁县| 红安县| 沐川县| 林芝县| 策勒县| 沿河|