ホームページ  >  記事  >  データベース  >  Redis は高い同時実行数のカウントを実装します

Redis は高い同時実行数のカウントを実装します

尚
転載
2020-04-27 09:12:132588ブラウズ

Redis は高い同時実行数のカウントを実装します

ビジネス要件でカウンタが必要になるシナリオがよくあります。たとえば、携帯電話番号では 1 日に送信できるテキスト メッセージの数が 5 件に制限され、インターフェイスでは 1 回あたりのリクエスト数が制限されています。分、インターフェイスは 1 日あたりの呼び出し数に制限されているなど。上記の要件は、Redis の Incr 自動インクリメント コマンドを使用して簡単に実現できます。例として、1 日のインターフェイスへの呼び出し数の制限を考えます:

	/**
	 * 是否拒绝服务
	 * @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;
	}
}	

Redis の詳細については、redis 入門チュートリアル 列に注目してください。

以上がRedis は高い同時実行数のカウントを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。