欢迎来到站圈网!

   as  code/json  pandas  ::v-deep  121

投稿中心

Java

当前位置:主页 > 编程语言 > Java >

Java利用Redis实现高并发计数器的示例代码

时间:2021-02-23|栏目:Java|点击:

业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送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;
 }
}

 到此这篇关于Java利用Redis实现高并发计数器的示例代码的文章就介绍到这了,更多相关Java Redis 高并发计数器内容请搜索站圈网以前的文章或继续浏览下面的相关文章希望大家以后多多支持站圈网!

上一篇:聊聊@RequestParam,@PathParam,@PathVariable等注解的区别

栏    目:Java

下一篇:没有了

本文标题:Java利用Redis实现高并发计数器的示例代码

本文地址:http://www.zhano.cn/language/Java/33421.html

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:12043006 | 邮箱:12043006#qq.com(#换成@)

Copyright © 2019-2020

Power by DedeCms 豫ICP备19001789号