Heim  >  Artikel  >  Datenbank  >  Redis implementiert eine hohe Parallelitätszählung

Redis implementiert eine hohe Parallelitätszählung

尚
nach vorne
2020-04-27 09:12:132587Durchsuche

Redis implementiert eine hohe Parallelitätszählung

Es gibt oft Szenarien, in denen Zähler in geschäftlichen Anforderungen benötigt werden: Beispielsweise ist eine Mobiltelefonnummer auf das Versenden von 5 Textnachrichten pro Tag beschränkt, eine Schnittstelle ist auf die Anzahl der Anfragen pro Tag beschränkt Minute, und eine Schnittstelle ist auf die Anzahl der Anrufe pro Tag usw. beschränkt. Die oben genannten Anforderungen können einfach mit dem Auto-Inkrementierungsbefehl Incr von Redis erreicht werden. Nehmen Sie als Beispiel den Grenzwert für die Anzahl der Aufrufe einer Schnittstelle an einem Tag:

	/**
	 * 是否拒绝服务
	 * @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;
	    }
		//没超过限制,业务逻辑……
 }

Ermitteln Sie vor jedem Aufruf der Schnittstelle zunächst den Wert, nachdem der Zähler erhöht wurde, wenn er kleiner als der Grenzwert ist , lassen Sie es los und führen Sie den folgenden Code aus. Wenn es größer als das Limit ist, wird es abgefangen.

JedisUtil-Toolklasse:

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

Weitere Redis-Kenntnisse finden Sie in der Spalte Redis-Einführungs-Tutorial.

Das obige ist der detaillierte Inhalt vonRedis implementiert eine hohe Parallelitätszählung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen