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

wordpress 留言给站长发邮件如何购买网站主机

wordpress 留言给站长发邮件,如何购买网站主机,杨振峰网站开发,pc网站自动转换wap网站在上一节中#xff0c;该接口已经接受过风控的处理#xff0c;过滤掉了机器人脚本请求#xff0c;剩下都是人为的下单请求。为了防止用户短时间内高频率点击抢课链接#xff0c;海量请求造成服务器过载#xff0c;这里使用接口限流算法。 先介绍下几种常用的接口限流策略…在上一节中该接口已经接受过风控的处理过滤掉了机器人脚本请求剩下都是人为的下单请求。为了防止用户短时间内高频率点击抢课链接海量请求造成服务器过载这里使用接口限流算法。 先介绍下几种常用的接口限流策略 1.计数器算法固定窗口 计数器算法是使用计数器在周期内累加访问次数当达到设定的限流值时触发限流策略。下一个周期开始时进行清零重新计数。 此算法存在一个问题就是在此周期快结束时大量请求泳入请求一直持续到下一周期开始一段时间后这段时间的接口访问量大大超过服务器的负载却小于每个周期的计数器最大值。 2.滑动窗口 滑动窗口算法是将时间周期分为N个小周期分别记录每个小周期内访问次数并且根据时间滑动删除过期的小周期。尽可能地平滑过渡每一个小周期。 3、漏桶算法 漏桶算法是访问请求到达时直接放入漏桶如当前容量已达到上限限流值则进行丢弃触发限流策略。漏桶以固定的速率进行释放访问请求即请求通过直到漏桶为空。 4.令牌桶算法 令牌桶算法是程序以rr时间周期/限流值的速度向令牌桶中增加令牌直到令牌桶满请求到达时向令牌桶请求令牌如获取到令牌则通过请求否则触发限流策略 本文常用简单有效的固定窗口策略进行接口限流具体流程如下 1.自定义接口限流注解 package com.example.seckilldemo.config;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface AccessLimit {int second();int maxCount();boolean needLogin() default true; } 2.将接口限流做成拦截器写入WebConfig中在回掉方法中扫描到有限流注解的接口进行接口限流 package com.example.seckilldemo.config;import com.example.seckilldemo.pojo.User; import com.example.seckilldemo.service.UserService; import com.example.seckilldemo.utils.CookieUtil; import com.example.seckilldemo.vo.RespBean; import com.example.seckilldemo.vo.RespBeanEnum; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.thymeleaf.util.StringUtils;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.concurrent.TimeUnit;Component public class AccessLimitInterceptor implements HandlerInterceptor {Autowiredprivate UserService itUserService;Autowiredprivate RedisTemplate redisTemplate;Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {User tUser getUser(request, response);UserContext.setUser(tUser);HandlerMethod hm (HandlerMethod) handler;//判断有没有接口限流的注解AccessLimit accessLimit hm.getMethodAnnotation(AccessLimit.class);if (accessLimit null) {return true;}int second accessLimit.second();int maxCount accessLimit.maxCount();boolean needLogin accessLimit.needLogin();String key request.getRequestURI();if (needLogin) {if (tUser null) {render(response, RespBeanEnum.SESSION_ERROR);}key : tUser.getId();}//接口限流使用计数器算法ValueOperations valueOperations redisTemplate.opsForValue();Integer count (Integer) valueOperations.get(key);if (count null) {valueOperations.set(key, 1, second, TimeUnit.SECONDS);} else if (count maxCount) {valueOperations.increment(key);} else {render(response, RespBeanEnum.ACCESS_LIMIT_REACHED);return false;}}return true;}private void render(HttpServletResponse response, RespBeanEnum respBeanEnum) throws IOException {response.setCharacterEncoding(UTF-8);response.setContentType(application/json);PrintWriter printWriter response.getWriter();RespBean bean RespBean.error(respBeanEnum);printWriter.write(new ObjectMapper().writeValueAsString(bean));printWriter.flush();printWriter.close();}private User getUser(HttpServletRequest request, HttpServletResponse response) {String userTicket CookieUtil.getCookieValue(request, userTicket);if (StringUtils.isEmpty(userTicket)) {return null;}return itUserService.getUserByCookie(userTicket, request, response);} } 这里还有个问题是虽然自增是原子操作但是获取计数器并不是改进使用lua脚本配合计数器实现接口限流原子性操作 Component public class AccessLimitInterceptor implements HandlerInterceptor {Autowiredprivate UserService itUserService;Autowiredprivate RedisTemplate redisTemplate;Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {User tUser getUser(request, response);UserContext.setUser(tUser);HandlerMethod hm (HandlerMethod) handler;//判断有没有接口限流的注解AccessLimit accessLimit hm.getMethodAnnotation(AccessLimit.class);if (accessLimit ! null) {int second accessLimit.second();int maxCount accessLimit.maxCount();boolean needLogin accessLimit.needLogin();String key request.getRequestURI();if (needLogin) {if (tUser null) {render(response, RespBeanEnum.SESSION_ERROR);return false;}key : tUser.getId();}// 使用Lua脚本确保操作的原子性String luaScript local currentCount redis.call(get, KEYS[1]) if currentCount and tonumber(currentCount) tonumber(ARGV[1]) then redis.call(incr, KEYS[1]) if tonumber(currentCount) 0 then redis.call(expire, KEYS[1], ARGV[2]) end return 0 end return 1;DefaultRedisScriptBoolean redisScript new DefaultRedisScript(luaScript, Boolean.class);Boolean isLimited (Boolean) redisTemplate.execute(redisScript, Collections.singletonList(key), maxCount, second);if (isLimited) {render(response, RespBeanEnum.ACCESS_LIMIT_REACHED);return false;}}}return true;}private void render(HttpServletResponse response, RespBeanEnum respBeanEnum) throws IOException {response.setCharacterEncoding(UTF-8);response.setContentType(application/json);PrintWriter printWriter response.getWriter();RespBean bean RespBean.error(respBeanEnum);printWriter.write(new ObjectMapper().writeValueAsString(bean));printWriter.flush();printWriter.close();}private User getUser(HttpServletRequest request, HttpServletResponse response){String userTicket CookieUtil.getCookieValue(request, userTicket);if (StringUtils.isEmpty(userTicket)) {return null;}return itUserService.getUserByCookie(userTicket, request, response);} }
http://www.w-s-a.com/news/554613/

相关文章:

  • 网站建设代码福州小程序开发平台
  • 了解做房产广告的网站手机版官方网站的建设
  • 如何与别的网站做友情链接做网站排名大概要多少钱
  • 东莞市锂电池网站建设HTML5怎么做自适应网站
  • 江苏城乡建设学校网站群晖建立wordpress
  • wordpress导入网站模板seo自学网官网
  • 购物网站服务器带宽北京网站开发周期
  • 同性做视频网站网站怎么添加栏目
  • 新余网站设计seo自学网站
  • 新乡个人网站建设价格wordpress数据插件
  • 你是网站设计有限公司的项目经理网站推广的重要性
  • 网站定制开发怎么写泸州设计公司有哪些
  • 上海网站建设zj kt迅速编程做网站
  • 郑州服装 网站建设网站栏目合理性
  • 平面设计在线网站最新汽油价格调整最新消息
  • 刷单网站建设wordpress缩略图 裁剪
  • 视差 网站泰州公司做网站
  • 广州网站优化系统怎么做淘客网站
  • 类似凡科互动的网站wordpress网站下载
  • 临沂网站制作公司安卓app开发实例教程
  • 泰州做网站 泰公网络科技公司网站升级中html
  • 如何做授权网站网站设计心得
  • 网站排名快速上升wordpress自动标签页
  • 做的好的手机网站有哪些万网域名交易
  • 网站怎么做漂亮点做陶瓷的公司网站
  • 软件开发设计制作网站下载自己怎么做视频收费网站
  • 江苏省建设安全协会网站天津网站建设哪家公司好
  • 资源类网站怎么做的网站上线准备工作
  • 长沙专业网站建设怎么做企业建站公司服务
  • 肇庆市有限公司网站建设手机直接看的网站有哪些