利用Redis实现高并发计数器

利用Redis实现高并发计数器业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。以一个接口一天限制调用次数为例: /** *是否拒绝服务 *@return */ privatebooleandenialOfService(StringuserId){ longc…

大家好,又见面了,我是你们的朋友全栈君。

业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送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 (result<=1 && 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;
	}
}	
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141991.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 角动量守恒与陀螺力矩[通俗易懂]

    角动量守恒与陀螺力矩[通俗易懂]角动量守恒与陀螺力矩角动量守恒定律.这个定律可以用快转的轮子和它下面的回转器来演示:见图20-1.假如我们站在一个转椅上,并拿着水平轴转动的轮子,这个轮子绕水平轴有一个角动量L0,L0=Jω其中J为轮子绕????轴的转动惯量,ω为绕????轴的角速度(图20-2所示坐标系),绕竖直轴的角动量不会因为椅子的支轴(无摩擦)而改变,假如我们把轮子用手将原来水平的转轴抬起来到竖直的方向,如图20-1所…

    2022年5月15日
    100
  • Vue.js 快速入门

    Vue.js 快速入门

    2022年2月21日
    38
  • local port是什么意思_tracert命令的用法

    local port是什么意思_tracert命令的用法使用talnet[ip][port]命令,在命令窗口下,让输入的字符回显。 1、cmd进入命令窗口。2、telnet127.0.0.19769连接。3、同时按下Ctrl+]4、输入setLOCALECHO5、再按回车。6、再输入字符,就可以看到了。 …

    2022年9月24日
    3
  • 一文搞懂│php 中的 DI 依赖注入「建议收藏」

    一文搞懂│php 中的 DI 依赖注入「建议收藏」学好依赖注入,让编程更简单

    2022年8月16日
    4
  • IDEA卸载

    IDEA卸载第一步:打开文件安装目录,点击1,鼠标右击【属性】,再点击打开文件安装位置。第二步:在打开的文件夹里面。找到【Uninstall.exe】这一选项。操作参照我在图中标注,双击使其正常运行启动。第三步:卸载过程的弹出框确认,是否需要删除一些配置和历史记录。第四步:就是确认前面的设置之后,然后就静静的等待进度条完成即可。第五步:删除的内容可以关注下,很多的删除了C盘的…

    2022年6月14日
    1.7K
  • 诺基亚S60手机c盘、d盘、e盘、z盘的作用

    诺基亚S60手机c盘、d盘、e盘、z盘的作用诺基亚S60手机c盘、d盘、e盘、z盘里文件夹的用途详细诠释
        一、【C盘】
      手机的C盘如同Windows的C盘,是用来放置SymbianOS的地方,所以我们需要给操作系统预留足够的空间(比如用来存放软件运行时生成的临时文件)。对于已扩充了MMC卡的机器,建议把应用软件和游戏都尽量安装到MMC卡上。
      手机内存和常驻内存的软件有关,如输入法、主题背景开机后就会常驻内存,正在运行的软件和游戏也会占用内存,增加动态内存的办法就是减少常驻内存的程序,用任务管理软件

    2022年7月11日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号