1、应用redis
    2、令牌桶算法

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.0.0.RELEASE</version>
    5. </parent>
    6. <dependencies>
    7. <dependency>
    8. <groupId>org.springframework.boot</groupId>
    9. <artifactId>spring-boot-starter-web</artifactId>
    10. </dependency>
    11. <dependency>
    12. <groupId>com.google.guava</groupId>
    13. <artifactId>guava</artifactId>
    14. <version>25.1-jre</version>
    15. </dependency>
    16. </dependencies>
    1. /**
    2. * 功能说明:使用RateLimiter 实现令牌桶算法
    3. *
    4. */
    5. @RestController
    6. public class IndexController {
    7. @Autowired
    8. private OrderService orderService;
    9. // 解释:1.0 表示 每秒中生成1个令牌存放在桶中
    10. RateLimiter rateLimiter = RateLimiter.create(1.0);
    11. // 下单请求
    12. @RequestMapping("/order")
    13. public String order() {
    14. // 1.限流判断
    15. // 如果在500秒内 没有获取不到令牌的话,则会一直等待
    16. System.out.println("生成令牌等待时间:" + rateLimiter.acquire());
    17. boolean acquire = rateLimiter.tryAcquire(500, TimeUnit.MILLISECONDS);
    18. if (!acquire) {
    19. System.out.println("你在怎么抢,也抢不到,因为会一直等待的,你先放弃吧!");
    20. return "你在怎么抢,也抢不到,因为会一直等待的,你先放弃吧!";
    21. }
    22. // 2.如果没有达到限流的要求,直接调用订单接口
    23. boolean isOrderAdd = orderService.addOrder();
    24. if (isOrderAdd) {
    25. return "恭喜您,抢购成功!";
    26. }
    27. return "抢购失败!";
    28. }
    29. }

    3、滑动窗口计数器法
    4、漏桶算法