• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Redis实现高并发计数器

    业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送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 + lua解决抢红包高并发的问题
    • Nginx+Lua+Redis构建高并发Web应用
    • 如何利用Redis锁解决高并发问题详解
    • Redis瞬时高并发秒杀方案总结
    • PHP实现Redis单据锁以及防止并发重复写入
    • jedispool连redis高并发卡死的问题
    • 使用lua+redis解决发多张券的并发问题
    上一篇:基于Redis的分布式锁的简单实现方法
    下一篇:Redis事务涉及的watch、multi等命令详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Redis实现高并发计数器 Redis,实现,高并发,高,并发,