利用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图像降噪算法——从BM3D到VBM4D

    图像降噪算法——从BM3D到VBM4D图像降噪算法——BM3D图像降噪算法——BM3D1.基本原理2.C++代码实现3.结论图像降噪算法——BM3DBM3D是目前非AI降噪算法中最优的算法之一,其降噪效果确实非常惊艳,网上的资料也相对较多,我觉得写得最好的一篇博客是通俗语言说BM3D,这个博主应该是个搞图像处理的大佬,对原理理解得比较深,这里我对BM3D进行一个简单总结,然后扒了一个C++实现对接口进行了修改,移植到我自己的工程里(因为实在是忙得没时间自己复现一遍)1.基本原理2.C++代码实现3.结论…

    2022年6月5日
  • 从零开始搭建zookeeper集群(超详细)

    从零开始搭建zookeeper集群(超详细)

    2021年8月4日
  • ps批量磨皮滤镜插件ArcSoft Portrait3+ 中文版瘦脸自动识别人脸win/mac支持2018「建议收藏」

    ps批量磨皮滤镜插件ArcSoft Portrait3+ 中文版瘦脸自动识别人脸win/mac支持2018「建议收藏」【系统支持】win系统(win10系统PS不能使用插件版,但是可以使用独立版)mac苹果系统只能使用插件版,不能使用独立版【支持PS】支持CS6-CC2108也可以独立使用苹果系统不能独立使用ArcSoftPortrait+是一款智能化的人像磨皮软件,采用世界上最尖端的人脸检测技术,能够自动检测人像脸部进行磨皮。ArcSoftPortrait+还支持批量处理功能,能同时处理上千张…

    2022年7月22日
  • pycharm远程运行_泪指轮传说2图文攻略

    pycharm远程运行_泪指轮传说2图文攻略推荐阅读:http://pycharm.iswbm.com这一篇文章是以前的文章,有的朋友已经看过,但是没有关系,因为这次我准备介绍这几大调试工具都是如何调试,又该如何选择。一般情况下,我们开发调试都是在个人PC上完成,遇到问题,开一下Pycharm的调试器,很快就能找到问题所在。可有些时候,项目代码的运行会对运行环境有依赖,必须在部署了相关依赖组件的服务器上才可以运行,这就直接导致了我们不能在本地进行调试。对于这种特殊的场景,就我所知,有如下两种解决方案:pdbRemoteDebug

    2022年8月28日
  • 视觉里程计简介

    视觉里程计简介本文英文博客原文:http://avisingh599.github.io/vision/monocular-vo/这篇博客主要讲述一个简单的视觉里程计(VisualOdometry)的实现。整个流程较为简单,后续在此基础上对效率精度进一步提高。什么是视觉里程计?首先我们看一看维基百科的介绍https://en.wikipedia.org/wiki/Visual_odomet…

    2022年6月29日
  • 国产 Linux 发行版再添新成员,CutefishOS 系统简单体验

    国产 Linux 发行版再添新成员,CutefishOS 系统简单体验本文转载自IT之家随着众多开发者的加入,现代化且功能强大的Linux发行版不断涌现。现在国产Linux发行版再多一员大将,其名为CutefishOS,它在Ubuntu上提供了桌面环境,在国外Linux开源社区相当受欢迎。CuteFishOS的目标是“做更好的桌面操作系统”。为此,开发者使用KDE框架、Qt和KDEPlasma5构建一个新的桌面环境(’CuteFishDE’),似乎还借鉴了深度操作系统(DDE)、MATE和JingOS。据官网介绍,这是一款简

    2022年5月16日

发表回复

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

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