redis实现高并发计数

互联网 20-4-27

业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送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实现高并发计数的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: redis
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:CentOS如何将Redis配置为系统服务

相关资讯