redis 를 바탕 으로 하 는 네 가지 흔 한 흐름 제한 전략 을 상세 하 게 설명 합 니 다.
2.고정 시간 창 알고리즘
장점:
controller
@RequestMapping(value = "/start",method = RequestMethod.GET)
public Map<string,object> start(@RequestParam Map<string, object=""> paramMap) {
return testService.startQps(paramMap);
}
service
@Override
public Map<string, object=""> startQps(Map<string, object=""> paramMap) {
// qps
Integer times = 100;
if (paramMap.containsKey("times")) {
times = Integer.valueOf(paramMap.get("times").toString());
}
String redisKey = "redisQps";
RedisAtomicInteger redisAtomicInteger = new RedisAtomicInteger(redisKey, redisTemplate.getConnectionFactory());
int no = redisAtomicInteger.getAndIncrement();
// 1S
if (no == 0) {
redisAtomicInteger.expire(1, TimeUnit.SECONDS);
}
// time=2 qps=3
if (no > times) {
throw new RuntimeException("qps refuse request");
}
//
Map<string, object=""> map = new HashMap<>();
map.put("success", "success");
return map;
}
결과 테스트:우리 가 설정 한 qps=3,우 리 는 다섯 개의 병발 이 들 어 온 후 세 개의 정상 적 인 방문 을 볼 수 있 습 니 다.뒤의 두 개 는 실 패 했 습 니 다.잠시 만 기 다 려 주세요.우 리 는 동시 방문 을 하고 있 습 니 다.앞의 세 개 는 다시 정상적으로 방문 할 수 있 습 니 다.설명 이 다음 시간 창 에 도 착 했 습 니 다.
3.미끄럼 시간 창 알고리즘
장점:
실현:
controller
@RequestMapping(value = "/startList",method = RequestMethod.GET)
public Map<string,object> startList(@RequestParam Map<string, object=""> paramMap) {
return testService.startList(paramMap);
}
service
String redisKey = "qpsZset";
Integer times = 100;
if (paramMap.containsKey("times")) {
times = Integer.valueOf(paramMap.get("times").toString());
}
long currentTimeMillis = System.currentTimeMillis();
long interMills = inter * 1000L;
Long count = redisTemplate.opsForZSet().count(redisKey, currentTimeMillis - interMills, currentTimeMillis);
if (count > times) {
throw new RuntimeException("qps refuse request");
}
redisTemplate.opsForZSet().add(redisKey, UUID.randomUUID().toString(), currentTimeMillis);
Map<string, object=""> map = new HashMap<>();
map.put("success", "success");
return map;
결과 테스트:장점:
실현:
controller
@RequestMapping(value = "/startLoutong",method = RequestMethod.GET)
public Map<string,object> startLoutong(@RequestParam Map<string, object=""> paramMap) {
return testService.startLoutong(paramMap);
}
서 비 스 는 서비스 에서 redis 의 list 기능 을 통 해 통 의 효 과 를 모 의 합 니 다.이곳 의 코드 는 실험실 성질 이다.실제 사용 에서 우 리 는 병발 문 제 를 고려 해 야 한다.
@Override
public Map<string, object=""> startLoutong(Map<string, object=""> paramMap) {
String redisKey = "qpsList";
Integer times = 100;
if (paramMap.containsKey("times")) {
times = Integer.valueOf(paramMap.get("times").toString());
}
Long size = redisTemplate.opsForList().size(redisKey);
if (size >= times) {
throw new RuntimeException("qps refuse request");
}
Long aLong = redisTemplate.opsForList().rightPush(redisKey, paramMap);
if (aLong > times) {
// 。 。 。
redisTemplate.opsForList().trim(redisKey, 0, times-1);
throw new RuntimeException("qps refuse request");
}
Map<string, object=""> map = new HashMap<>();
map.put("success", "success");
return map;
}
하류 소비
@Component
public class SchedulerTask {
@Autowired
RedisTemplate redisTemplate;
private String redisKey="qpsList";
@Scheduled(cron="*/1 * * * * ?")
private void process(){
//
System.out.println(" 。。。。。。");
redisTemplate.opsForList().trim(redisKey, 2, -1);
}
}
테스트:5.영패 통 알고리즘
public Map<string, object=""> startLingpaitong(Map<string, object=""> paramMap) {
String redisKey = "lingpaitong";
String token = redisTemplate.opsForList().leftPop(redisKey).toString();
// ,
if (StringUtils.isEmpty(token)) {
throw new RuntimeException(" ");
}
Map<string, object=""> map = new HashMap<>();
map.put("success", "success");
return map;
}
@Scheduled(cron="*/1 * * * * ?")
private void process(){
//
System.out.println(" 。。。。。。");
for (int i = 0; i < 2; i++) {
redisTemplate.opsForList().rightPush(redisKey, i);
}
}
이상 은 redis 를 바탕 으로 하 는 네 가지 흔히 볼 수 있 는 흐름 제한 전략 에 대한 상세 한 내용 입 니 다.redis 의 흐름 제한 전략 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redis 해시에 대한 완벽한 가이드변경 가능하므로 필요에 따라 쉽게 변경하고 업데이트할 수 있습니다. Redis 해시는 구조가 평평하므로 JSON에서와 같이 여러 수준을 가질 수 없습니다. redis 해시의 명명 규칙은 hash:key 로 입력되므로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.