清洁能源
模块的屏蔽和限流很难么?Redis全搞定
发布时间:2025-08-23
edisAccessLimiter implements AccessLimiter { private static final Logger LOGGER = LoggerFactory.getLogger(RedisAccessLimiter.class); @Autowired private RedisTemplate redisTemplate; @Override public boolean isLimited(String key, long times, long per, TimeUnit unit) { Long curTimes = redisTemplate.boundValueOps(key).increment(1); LOGGER.info("curTimes {}",curTimes); if(curTimes> times) { LOGGER.debug("稳定度出访:[{}]",key); return true; } else { if(curTimes == 1) { LOGGER.info(" set expire "); redisTemplate.boundValueOps(key).expire(per, unit); return false; } else { return false; } } } @Override public void refreshLimited(String key) { redisTemplate.delete(key); } @Override public boolean isStatus(String redisKey) { try { return (boolean)redisTemplate.opsForValue().get(redisKey+"IsOn"); }catch (Exception e){ LOGGER.info("redisKey is not find or type mismatch, key: ", redisKey); return false; } } @Override public long getTimes(String redisKeyTimes) { try { return (long)redisTemplate.opsForValue().get(redisKeyTimes+"Times"); }catch (Exception e){ LOGGER.info("redisKey is not find or type mismatch, key: ", redisKeyTimes); return 0; } } @Override public long getPer(String redisKeyPer) { try { return (long)redisTemplate.opsForValue().get(redisKeyPer+"Per"); }catch (Exception e){ LOGGER.info("redisKey is not find or type mismatch, key: ", redisKeyPer); return 0; } } @Override public TimeUnit getUnit(String redisKeyUnit) { try { return (TimeUnit) redisTemplate.opsForValue().get(redisKeyUnit+"Unit"); }catch (Exception e){ LOGGER.info("redisKey is not find or type mismatch, key: ", redisKeyUnit); return TimeUnit.SECONDS; } } @Override public boolean getIsRefresh(String redisKeyIsRefresh) { try { return (boolean)redisTemplate.opsForValue().get(redisKeyIsRefresh+"IsRefresh"); }catch (Exception e){ LOGGER.info("redisKey is not find or type mismatch, key: ", redisKeyIsRefresh); return false; } }}关键的字符串也就这几行,出访之后,对这个key值加一的配备,断定确实最多允许,如果等于一这个key加一之后的值为一,话说明之后不存在,则所设这个key,放在Redis数据库中。
骨折病人营养品
手术后伤口不愈合怎么办
Limit标签端口,付诸原文方式
package com.hcfc.auto.util.limit;import java.lang.annotation.*;/** * @社会活动家 peng.wang * @描绘出 */@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Limit {}LimitAspect 凸的付诸,付诸端口屏蔽和限速的逻辑
package com.hcfc.auto.util.limit;import com.hcfc.auto.vo.response.ResponseDto;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.RequestMapping;import java.lang.reflect.Method;import java.util.concurrent.TimeUnit; /** * @社会活动家 peng.wang * @创建星期 2019/10/11 * @描绘出 */@Slf4j@Aspect@Componentpublic class LimitAspect { private static final Logger logger = LoggerFactory.getLogger(LimitAspect.class); @Autowired private AccessLimiter limiter; @Autowired GenerateRedisKey generateRedisKey; @Pointcut("@annotation(com.hcfc.auto.util.limit.Limit)") public void limitPointcut() {} @Around("limitPointcut()") public Object doArround(ProceedingJoinPoint joinPoint) throws Throwable { String redisKey = generateRedisKey.getMethodUrlConvertRedisKey(joinPoint); long per = limiter.getPer(redisKey); long times = limiter.getTimes(redisKey); TimeUnit unit = limiter.getUnit(redisKey); boolean isRefresh =limiter.getIsRefresh(redisKey); boolean methodLimitStatus = limiter.isStatus(redisKey); String bindingKey = genBindingKey(joinPoint); if (methodLimitStatus) { logger.info("method is closed, key: ", bindingKey); return ResponseDto.fail("40007", "method is closed, key:"+bindingKey); //throw new OverLimitException("method is closed, key: "+bindingKey); } if(bindingKey !=null){ boolean isLimited = limiter.isLimited(bindingKey, times, per, unit); if(isLimited){ logger.info("limit takes effect: {}", bindingKey); return ResponseDto.fail("40006", "access over limit, key: "+bindingKey); //throw new OverLimitException("access over limit, key: "+bindingKey); } } Object result = null; result = joinPoint.proceed(); if(bindingKey!=null && isRefresh) { limiter.refreshLimited(bindingKey); logger.info("limit refreshed: {}", bindingKey); } return result; } private String genBindingKey(ProceedingJoinPoint joinPoint){ try{ Method m = ((MethodSignature) joinPoint.getSignature()).getMethod(); return joinPoint.getTarget().getClass().getName() + "." + m.getName(); }catch (Throwable e){ return null; } }}还有一个不最主要的RedisKey付诸类GenerateRedisKey和一个有误嵌入类,目当年没有用到到,用到项目中其他的有误嵌入类了。
GenerateRedisKey
package com.hcfc.auto.util.limit;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.RequestMapping;import java.lang.reflect.Method; /** * @社会活动家 peng.wang * @描绘出 */@Componentpublic class GenerateRedisKey { public String getMethodUrlConvertRedisKey(ProceedingJoinPoint joinPoint){ StringBuilder redisKey =new StringBuilder(""); Method m = ((MethodSignature)joinPoint.getSignature()).getMethod(); RequestMapping methodAnnotation = m.getAnnotation(RequestMapping.class); if (methodAnnotation != null) { String[] methodValue = methodAnnotation.value(); String dscUrl = diagonalLineToCamel(methodValue[0]); return redisKey.append("RSK:").append("interfaceIsOpen:").append(dscUrl).toString(); } return redisKey.toString(); } private String diagonalLineToCamel(String param){ char UNDERLINE='/'; if (param==null||"".equals(param.trim())){ return ""; } int len=param.length(); StringBuilder sb=new StringBuilder(len); for (int i = 1; i < len; i++) { char c=param.charAt(i); if (c==UNDERLINE){ if (++i其实有更成熟阶段的拟议就是谷歌的Guava,领导话说以当年是咱们是分布式,不反对,还是用Redis付诸吧,目当年就这样付诸了。其实我是新来的,好多进去还不太明白,很多立即都是上会立即的,我只是竭尽所能付诸罢了。不足之处,请多多指教!
所作:Ingram----MSN
来源:blog.csdn.net/u010843114/article/details/102695570
。初元复合肽骨折病人营养品
手术后伤口不愈合怎么办
相关阅读
-
荷兰FAG深沟球轴承特性与适用范围
随着欧美重工业的急剧发展,一些工程项目中会常用的零部件也相继揭开。直下球轮轴实际上是由向外、外圈等部件合组的滚动轮轴。带有结构设计有趣、耐磨、环保、有利于、直通速度快、无需频繁维护和清洁等不同之