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

做装饰公司网站6网站建设培训 通州

做装饰公司网站6,网站建设培训 通州,如何在服务器上发布网站,最优秀的无锡网站建设1、Redis实现限流方案的核心原理#xff1a; redis实现限流的核心原理在于redis 的key 过期时间#xff0c;当我们设置一个key到redis中时#xff0c;会将key设置上过期时间#xff0c;这里的实现是采用lua脚本来实现原子性的。2、准备 引入相关依赖 dependency…1、Redis实现限流方案的核心原理 redis实现限流的核心原理在于redis 的key 过期时间当我们设置一个key到redis中时会将key设置上过期时间这里的实现是采用lua脚本来实现原子性的。2、准备 引入相关依赖 dependency groupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId /dependency dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId /dependency dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.23/version /dependency dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdversion3.1.5/version /dependency dependencygroupIdorg.yaml/groupIdartifactIdsnakeyaml/artifactIdversion2.2/version /dependency dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId /dependency dependencygroupIdcom.google.protobuf/groupIdartifactIdprotobuf-java/artifactIdversion3.25.1/version /dependency添加redis配置信息 server:port: 6650nosql:redis:host: XXX.XXX.XXX.XXXport: 6379password:database: 0spring:cache:type: redisredis:host: ${nosql.redis.host}port: ${nosql.redis.port}password: ${nosql.redis.password}lettuce:pool:enabled: truemax-active: 8max-idle: 8min-idle: 0max-wait: 1000配置redis Conf Configuration public class RedisConfig {/*** 序列化* jackson2JsonRedisSerializer** param redisConnectionFactory 复述,连接工厂* return {link RedisTemplate}{link Object}, {link Object}*/Beanpublic RedisTemplateObject, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplateObject, Object template new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);template.setKeySerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}/*** 加载lua脚本* return {link DefaultRedisScript}{link Long}*/Beanpublic DefaultRedisScriptLong limitScript() {DefaultRedisScriptLong redisScript new DefaultRedisScript();redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource(luaFile/rateLimit.lua)));redisScript.setResultType(Long.class);return redisScript;}}3、限流实现 编写核心lua脚本 local key KEYS[1] -- 取出key对应的统计判断统计是否比限制大如果比限制大直接返回当前值 local count tonumber(ARGV[1]) local time tonumber(ARGV[2]) local current redis.call(get, key) if current and tonumber(current) count thenreturn tonumber(current) end --如果不比限制大进行重新设置时间 current redis.call(incr, key) if tonumber(current) 1 thenredis.call(expire, key, time) end return tonumber(current)编写注解 limiter Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface RateLimiter {/*** 限流key*/String key() default rate_limit:;/*** 限流时间,单位秒*/int time() default 60;/*** 限流次数*/int count() default 100;/*** 限流类型*/LimitType limitType() default LimitType.DEFAULT; }增加注解类型 public enum LimitType {/*** 默认策略全局限流*/DEFAULT,/*** 根据请求者IP进行限流*/IP }添加IPUtils Slf4j public class IpUtils {/**ip的长度值*/private static final int IP_LEN 15;/** 使用代理时多IP分隔符*/private static final String SPLIT_STR ,;/*** 获取IP地址* p* 使用Nginx等反向代理软件 则不能通过request.getRemoteAddr()获取IP地址* 如果使用了多级反向代理的话X-Forwarded-For的值并不止一个而是一串IP地址X-Forwarded-For中第一个非unknown的有效IP字符串则为真实IP地址*/public static String getIpAddr(HttpServletRequest request) {String ip null;try {ip request.getHeader(x-forwarded-for);if (StrUtil.isBlank(ip)) {ip request.getHeader(Proxy-Client-IP);}if (StrUtil.isBlank(ip)) {ip request.getHeader(WL-Proxy-Client-IP);}if (StrUtil.isBlank(ip)) {ip request.getHeader(HTTP_CLIENT_IP);}if (StrUtil.isBlank(ip)) {ip request.getHeader(HTTP_X_FORWARDED_FOR);}if (StrUtil.isBlank(ip)) {ip request.getRemoteAddr();}} catch (Exception e) {log.error(IPUtils ERROR , e);}//使用代理则获取第一个IP地址if (!StrUtil.isBlank(ip) ip.length() IP_LEN) {if (ip.indexOf(SPLIT_STR) 0) {ip ip.substring(0, ip.indexOf(SPLIT_STR));}}return ip;} }核心处理类 Aspect Component Slf4j public class RateLimiterAspect {Resourceprivate RedisTemplateObject, Object redisTemplate;Resourceprivate RedisScriptLong limitScript;Before(annotation(rateLimiter))public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable {String key rateLimiter.key();int time rateLimiter.time();int count rateLimiter.count();String combineKey getCombineKey(rateLimiter, point);ListObject keys Collections.singletonList(combineKey);try {Long number redisTemplate.execute(limitScript, keys, count, time);if (number null || number.intValue() count) {throw new ServiceException(访问过于频繁请稍候再试);}log.info(限制请求{},当前请求{},缓存key{}, count, number.intValue(), key);} catch (ServiceException e) {throw e;} catch (Exception e) {throw new RuntimeException(服务器限流异常请稍候再试);}}public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) {StringBuilder stringBuilder new StringBuilder(rateLimiter.key());if (rateLimiter.limitType() LimitType.IP) {stringBuilder.append(IpUtils.getIpAddr(((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest())).append(-);}MethodSignature signature (MethodSignature) point.getSignature();Method method signature.getMethod();Class? targetClass method.getDeclaringClass();stringBuilder.append(targetClass.getName()).append(-).append(method.getName());return stringBuilder.toString();} }到此我们就可以利用注解对请求方法进行限流了
http://wiki.neutronadmin.com/news/45211/

相关文章:

  • 上海协策网站制作网站做外链平台有哪些
  • 婚纱摄影网站优化技巧建网站基础知识
  • 郑州威盟网站建设公司怎么样如何检测wordpress后台慢的原因
  • 网站开发js路径温州网站建设优化
  • 无锡做网站优化多少钱wordpress.org密码
  • 建设银行官方网站客户端网站备案基础知识
  • 苏州网站建设老板网站建设所需硬件
  • 网站备案后 如何建设随州哪里有网络推广方案
  • 保定网站制作费用php能用着手机网站开发
  • 定西网站建设大前端Wordpress图片主题
  • 做网站 提交源码 论坛propulsion wordpress
  • 旅游网站制作过程微信视频号怎么引流推广
  • 建立简单的网站已备案网站数量
  • 滕州网站建设培训做网站推广弊端
  • 长春网站制作设计做ppt的网站
  • 织梦做网站详细教程鹤岗网站seo
  • 梅河口建设局网站网站镜像上传到域名空间
  • php怎么建立站点手机怎么制作网站教程步骤
  • 营销网站四大要素律师免费咨询电话
  • 有没有专门做素食的美食网站重庆seo排名系统运营
  • 网站源码怎么做市场营销数字营销
  • 织梦源码网站模板进入深圳市住房和建设局网站
  • 做网络网站需要三证么织梦高端大气网站模板
  • 建设网站哪家比较好类似wordpress的系统有哪些
  • 建设局官方网站淘宝网站是语言用什么做的
  • 网站建设公司的市场定位网站建设与维护期末考试题
  • 免费网站设计工具甘肃崇信县门户网站
  • 网站建设太金手指六六二九本地电商平台有哪些
  • 网站建站网站299266co制作网站
  • 抚州建设网站欧洲站vat激活