>데이터 베이스 >Redis >redis는 높은 동시성 계산을 구현합니다.

redis는 높은 동시성 계산을 구현합니다.

尚
앞으로
2020-04-27 09:12:132627검색

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;
	}
}	

더 많은 Redis 지식을 보려면 redis 소개 튜토리얼 칼럼을 주목하세요.

위 내용은 redis는 높은 동시성 계산을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제