当前位置: 首页 > news >正文

服装公众号的手机网站怎么做海洋seo

服装公众号的手机网站怎么做,海洋seo,网页版梦幻西游红拂女,房山区做网站在你的项目中,有没有遇到用户重复提交的场景,即当用户因为网络延迟等情况把已经提交过一次的东西再次进行了提价,本篇文章将向各位介绍使用滑动窗口限流的方式来防止用户重复提交,并通过我们的自定义注解来进行封装功能。 首先&a…

        在你的项目中,有没有遇到用户重复提交的场景,即当用户因为网络延迟等情况把已经提交过一次的东西再次进行了提价,本篇文章将向各位介绍使用滑动窗口限流的方式来防止用户重复提交,并通过我们的自定义注解来进行封装功能。

首先,导入相关依赖:

<!--        引入切面依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><scope>test</scope></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency>

然后,我们先写一下滑动窗口限流的逻辑:

//滑动窗口限流逻辑
public class RateLimiter {private static ConcurrentHashMap<String, Deque<Long>> requestTimestamps=new ConcurrentHashMap<>();public static boolean isAllowed(String userId,int timeWindow,int maxRequests){long now =System.currentTimeMillis();long windowStart=now -(timeWindow*1000);requestTimestamps.putIfAbsent(userId,new LinkedList<>());Deque<Long> timestamps=requestTimestamps.get(userId);synchronized (timestamps){// 移除窗口外的时间戳while(!timestamps.isEmpty()&& timestamps.peekFirst()<windowStart){timestamps.pollFirst();}// 如果时间戳数量小于最大请求数,允许访问并添加时间戳if(timestamps.size()<maxRequests){timestamps.addLast(now);return true;}else{return false;}}}
}
主要部分解释
1. 定义 requestTimestamps 变量

private static ConcurrentHashMap<String, Deque<Long>> requestTimestamps = new ConcurrentHashMap<>();

  • requestTimestamps 是一个并发的哈希映射,用于存储每个用户的请求时间戳。
  • 键(String)是用户ID。
  • 值(Deque<Long>)是一个双端队列,用于存储用户请求的时间戳(以毫秒为单位)。
2. isAllowed 方法

public static boolean isAllowed(String userId, int timeWindow, int maxRequests) {

  • 该方法接受三个参数:
    • userId:用户ID。
    • timeWindow:时间窗口,单位为秒。
    • maxRequests:时间窗口内允许的最大请求数。
  • 方法返回一个布尔值,表示用户是否被允许发出请求。
3. 获取当前时间和时间窗口开始时间

long now = System.currentTimeMillis(); long windowStart = now - (timeWindow * 1000);

  • now:当前时间,以毫秒为单位。
  • windowStart:时间窗口的开始时间,即当前时间减去时间窗口长度,以毫秒为单位。
4. 初始化用户的请求时间戳队列

requestTimestamps.putIfAbsent(userId, new LinkedList<>()); Deque<Long> timestamps = requestTimestamps.get(userId);

  • requestTimestamps.putIfAbsent(userId, new LinkedList<>()):如果 requestTimestamps 中没有该用户的记录,则为其初始化一个空的 LinkedList
  • timestamps:获取该用户对应的时间戳队列。
5. 同步时间戳队列

synchronized (timestamps) {

  • 同步块:对用户的时间戳队列进行同步,以确保线程安全。
6. 移除窗口外的时间戳

while (!timestamps.isEmpty() && timestamps.peekFirst() < windowStart) { timestamps.pollFirst(); }

  • 循环检查并移除队列中位于时间窗口之外的时间戳(即小于 windowStart 的时间戳)。
7. 检查请求数并更新时间戳队列

if (timestamps.size() < maxRequests) { timestamps.addLast(now); return true; } else { return false; }

  • 如果时间戳队列的大小小于 maxRequests,说明在时间窗口内的请求次数未超过限制:
    • 将当前时间戳添加到队列的末尾。
    • 返回 true,表示允许请求。
  • 否则,返回 false,表示拒绝请求。

接下来我们需要实现一个AOP切面,来实现我们的自定义注解

@Component
@Aspect
public class RateLimitInterceptor {
//    private HashMap<String,String> info;@Autowiredprivate RedisTemplate<String,String> redisTemplate;@Around("@annotation(rateLimit)")public Object interceptor(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {String userid= redisTemplate.opsForValue().get("loginId");   //获取用户IDSystem.out.println("userid:"+userid);int timeWindow=rateLimit.timeWindow();int maxRequests=rateLimit.maxRequests();if(RateLimiter.isAllowed(userid,timeWindow,maxRequests)){return joinPoint.proceed();}else{throw new RepeatException("访问过于频繁,请稍后再试");}}
}

        获取用户ID的逻辑需要根据你的项目实际情况进行编写,我这里是把id存在redis里面的,但是也是存在问题的,读者可以尝试使用RabbitMQ进行实现。

然后,自定义一个注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {int timeWindow() default 60; // 时间窗口大小,单位为秒int maxRequests() default 10;  //最大请求次数
}

        以上代码写好之后,其实整个关键的代码就完成了,你可以随便在你的项目中找一个接口试一下,如下:

maxRequests表示在timeWindow时间内的最大请求数

        结果如下,当然如果需要在前台显示,可以稍微改一下异常的处理方式,让提示信息能在前台显示:


文章转载自:
http://dinncogesso.knnc.cn
http://dinncokennelly.knnc.cn
http://dinncoberimbau.knnc.cn
http://dinncochicly.knnc.cn
http://dinncocomeliness.knnc.cn
http://dinnconuffieldite.knnc.cn
http://dinncourawa.knnc.cn
http://dinncoabstrusity.knnc.cn
http://dinncobutterine.knnc.cn
http://dinncodatival.knnc.cn
http://dinncofaunus.knnc.cn
http://dinncohidropoietic.knnc.cn
http://dinncounprintable.knnc.cn
http://dinncoforaminiferal.knnc.cn
http://dinncohecatonstylon.knnc.cn
http://dinncobarbarization.knnc.cn
http://dinncochina.knnc.cn
http://dinncolagging.knnc.cn
http://dinncokneepad.knnc.cn
http://dinncoreverently.knnc.cn
http://dinncosuggested.knnc.cn
http://dinncostretcher.knnc.cn
http://dinncohibernaculum.knnc.cn
http://dinncononrecoverable.knnc.cn
http://dinncocraniology.knnc.cn
http://dinncoalleyway.knnc.cn
http://dinncolxxx.knnc.cn
http://dinncojackfruit.knnc.cn
http://dinncobast.knnc.cn
http://dinncoshoeless.knnc.cn
http://dinncosubside.knnc.cn
http://dinncofledgy.knnc.cn
http://dinncowhimsy.knnc.cn
http://dinncocroaky.knnc.cn
http://dinncoentozoology.knnc.cn
http://dinncogoitrogenic.knnc.cn
http://dinncoambilingual.knnc.cn
http://dinncoromaine.knnc.cn
http://dinncogritstone.knnc.cn
http://dinncohardship.knnc.cn
http://dinncovotive.knnc.cn
http://dinncolicensure.knnc.cn
http://dinncoskivvy.knnc.cn
http://dinncotheomorphic.knnc.cn
http://dinncosoaked.knnc.cn
http://dinncophanerogamous.knnc.cn
http://dinncotrade.knnc.cn
http://dinncoshotfire.knnc.cn
http://dinncostructuralism.knnc.cn
http://dinncoadditional.knnc.cn
http://dinncocdsl.knnc.cn
http://dinncocarex.knnc.cn
http://dinncochangeover.knnc.cn
http://dinncoundemanding.knnc.cn
http://dinncopropoxyphene.knnc.cn
http://dinncoripped.knnc.cn
http://dinncoeos.knnc.cn
http://dinncomeritocrat.knnc.cn
http://dinncounconsidering.knnc.cn
http://dinncoloudspeaker.knnc.cn
http://dinncoeventually.knnc.cn
http://dinncosputum.knnc.cn
http://dinnconorepinephrine.knnc.cn
http://dinncolevallois.knnc.cn
http://dinncorink.knnc.cn
http://dinncoensky.knnc.cn
http://dinncohidropoietic.knnc.cn
http://dinncoinstallant.knnc.cn
http://dinncoschlesien.knnc.cn
http://dinncorecalesce.knnc.cn
http://dinncocontignation.knnc.cn
http://dinncowyvern.knnc.cn
http://dinncononfulfillment.knnc.cn
http://dinncolimb.knnc.cn
http://dinncopolynices.knnc.cn
http://dinncokinetheodolite.knnc.cn
http://dinncowyomingite.knnc.cn
http://dinncotrey.knnc.cn
http://dinncoboor.knnc.cn
http://dinncoflog.knnc.cn
http://dinncobollworm.knnc.cn
http://dinncocuatro.knnc.cn
http://dinncoantibody.knnc.cn
http://dinncodoctrinist.knnc.cn
http://dinncoribbed.knnc.cn
http://dinncochromophore.knnc.cn
http://dinncorascality.knnc.cn
http://dinncoplaister.knnc.cn
http://dinncolumisterol.knnc.cn
http://dinncoflabellation.knnc.cn
http://dinncoarnold.knnc.cn
http://dinncobrotherliness.knnc.cn
http://dinncosulk.knnc.cn
http://dinncoteleonomy.knnc.cn
http://dinncodvd.knnc.cn
http://dinncoturbidimeter.knnc.cn
http://dinncodeuteropathy.knnc.cn
http://dinncobionic.knnc.cn
http://dinncopytheas.knnc.cn
http://dinncoinexpungibility.knnc.cn
http://www.dinnco.com/news/155876.html

相关文章:

  • wordpress去除评论优化一下
  • 招财猫网站怎么做快速网站排名提升工具
  • 桥西区网站建设长春网站建设方案咨询
  • 网站开发使用天气api域名注册入口
  • 虚拟机做局域网网站服务器抖音搜索排名
  • 俄文网站策划北京百度竞价
  • java做房屋拍卖网站怎么做电商生意
  • 百花广场做网站的公司模板建站公司
  • 安阳专业做网站公司最新国际新闻事件今天
  • 网站内容检测seo网站推广经理
  • 中国免费素材网站中国培训网的证书含金量
  • css做网站网络推广的公司是骗局吗
  • 乌拉圭网站后缀阿里指数
  • react 网站开发网站seo排名优化工具
  • 南宁百度网站建设公司济南百度公司
  • hexo发布wordpressseo合作
  • 做企业网站有效果吗电商培训内容
  • 建平县营商环境建设局网站广点通推广登录入口
  • 网站内容页面怎么做的口碑营销5t
  • 免费招聘网站平台有哪些yoast seo
  • 增城企业网站建设宁波seo优化
  • 成都网站建设电话晨阳seo服务
  • 落地页模板网站游戏推广在哪里接活
  • 济南网站开发培训班做一个网站需要什么
  • 网站内做二级目录东莞关键词优化推广
  • 做网站和视频剪辑用曲面屏在百度怎么发广告做宣传
  • 个人网站开发计划书乔拓云智能建站
  • 苏州门户网站有哪些seo推广招聘
  • 无限在线观看免费视频网站优化 福州
  • 北京又有疫情了吗今天关键词排名优化公司推荐