利用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;
	}
}	
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 达芬奇五年沉浮

    达芬奇五年沉浮达芬奇五年沉浮

  • window清理系统垃圾文件代码

    window清理系统垃圾文件代码创建一个txt,后缀改为.bat,文件名自己取,但是要知道这个文件是拿来清理系统垃圾的。代码如下:@echooffpauseecho正在清理系统垃圾文件,请稍等……del/f/s/q%systemdrive%\*.tmpdel/f/s/q%systemdrive%\*._mpdel/f/s/q%systemdrive%\*.logdel/f…

  • 音质好的linux主机,5千音质好的HIFI播放器有哪些?5款性价比“神砖”简评「建议收藏」

    本文已获得作者授权,文中言论不代表乙迷观点。作者:蓝色风暴作为HiFi发烧友,用手机听歌?呵呵,那肯定是不存在的。想要拥有好音质,手机应该是达不到要求的,毕竟手机的推力有限,不能很好发挥耳机的潜力,也就无法更高的还原音乐细节,从而让你无法感受到高解析、高保真的音乐效果,所以一款无损播放器是绝对少不了的。而当你听过高品质的音质,相信也会宠坏你的耳朵,这也是音乐发烧友耳朵挑剔的原因,所以不要跟发烧友谈…

  • smartctl命令详解_smartmontools

    smartctl命令详解_smartmontools安装smartctlubuntu系统安装方法。root@gucloud:~#aptinstallsmartmontoolsReadingpackagelists…DoneBuildingdependencytreeReadingstateinformation…DoneSuggestedpackages:gsmartcontrolsmart-notifiermailx|mailutilsThefollowingNEWp

  • axis2开发webservice_docker映射出来端口访问不了

    axis2开发webservice_docker映射出来端口访问不了记录一次正式环境服务报错排查记录。某日被通知线上服务告警,错入日志全是Timeoutwaitingforconnection首先梳理项目架构,项目很简单,就是一个使用axis2构建的webserice的客户端开始从此段报错入手排查,定位到MultiThreadedHttpConnectionManager这个类的doGetConnection方法privateHttpConnectiondoGetConnection(HostConfigurationhostCo.

  • java的反射(reflection)机制_腹部反射区图解

    java的反射(reflection)机制_腹部反射区图解1.什么是java反射java的反射机制是指在运行状态中,      对于任意一个类,都能知道这个类的所有属性和方法;      对于任意一个对象,都能够调用它的任意一个属性和方法;      这种动态获取的类的信息,和动态调用对象的方法的功能就是反射机制。2.反射的作用     在运行时,构造任意一个类的对象      在运行时,判断任意一个类的完整结构,比如属性,方法,内…

    2022年10月25日

发表回复

您的电子邮箱地址不会被公开。

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