Redis实现限流的三种方式

这篇具有很好参考价值的文章主要介绍了Redis实现限流的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、固定窗口

所谓固定窗口限流即时间窗口的起始和结束时间是固定的,在固定时间段内允许要求的请求数量访问,超过则拒绝;当固定时间段结束后,再重新开始下一个时间段进行计数。

我们可以根据当前的时间,以分钟为时间段,每分钟都生成一个key,用来inc,当达到请求数量就返回一些友好信息。

固定窗口

/**
 * @author: AngJie
 * @create: 2022-07-26 14:41
 **/
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm");
 
    @GetMapping("/Fixed")
    public String testFixedWindow() {
        String now = formatter.format(LocalDateTime.now());
 
        Long count = redisTemplate.opsForValue().increment(now + ":fixed");
        if (count > 5) {
            return "不好意思,服务器正忙,请一分钟后再试......";
        } else {
            return "服务端正在处理";
        }
    }
}

 

该方式优点是比较简单粗暴,缺点是不够灵活,对于边界问题不能够处理,如设置的时间段刚开始时流量占满了设置的最大次数,后面一段时间则不能够再进行访问,必须等该时间段过了后才可以再次访问。

二、滑动窗口

针对固定窗口限流的问题,可以采用滑动窗口来优化改善。所谓滑动窗口即设置的时间窗口的起始和结束时间是不断变化的,时间差值不变,允许的请求数量不变。

我们可以将请求打造成一个zset数组,当每一次请求进来的时候,value保持唯一,可以用UUID生成,而score可以用当前时间戳表示,因为score我们可以用来计算当前时间戳之内有多少的请求数量。而zset数据结构也提供了zrange方法让我们可以很轻易的获取到2个时间戳内有多少请求。

/**
 * @author: AngJie
 * @create: 2022-07-26 14:41
 **/
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @GetMapping("/Sliding")
    public String testSlidingWindow() {
        Long currentTime = System.currentTimeMillis();
 
        System.out.println(currentTime);
        if (redisTemplate.hasKey("limit")) {
            // intervalTime是限流的时间
            Long intervalTime = 60000L;
            Integer count = redisTemplate.opsForZSet().rangeByScore("limit", currentTime - intervalTime, currentTime).size();
            System.out.println(count);
            if (count != null && count > 5) {
                return "每分钟最多只能访问5次";
            }
        }
        redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(), currentTime);
        return "访问成功";
    }
}

 

通过上述代码可以做到滑动窗口的效果,并且能保证每N秒内至多M个请求,缺点就是zset的数据结构会越来越大。实现方式相对也是比较简单的。

三、令牌桶

Redisson可以实现很多东西,在Redis的基础上,Redisson做了超多的封装,不仅可以用来实现分布式锁,还可以帮助我们实现令牌桶限流。

RateLimter主要作用就是可以限制调用接口的次数。主要原理就是调用接口之前,需要拥有指定个令牌。限流器每秒会产生X个令牌放入令牌桶,调用接口需要去令牌桶里面拿令牌。如果令牌被其它请求拿完了,那么自然而然,当前请求就调用不到指定的接口。

RateLimter实现限流

/**
 * @author: AngJie
 * @create: 2022-07-26 14:41
 **/
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Autowired
    private Redisson redisson;
 
    @GetMapping("/Token")
    public String testTokenBucket() {
        RRateLimiter rateLimiter = redisson.getRateLimiter("myRateLimiter");
 
        // 最大流速 = 每10秒钟产生1个令牌
        rateLimiter.trySetRate(RateType.OVERALL, 1, 10, RateIntervalUnit.SECONDS);
        //需要1个令牌
        if (rateLimiter.tryAcquire(1)) {
            return "令牌桶里面有可使用的令牌";
        }
        return "不好意思,请过十秒钟再来~~~~~~~";
 
    }
}

 文章来源地址https://www.toymoban.com/news/detail-677507.html

到了这里,关于Redis实现限流的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis的三种集群模式(图解)

    主从复制模式 一个主节点和多个从节点。主节点提供写入和读取功能,但是从属节点只提供读取功能。 主从复制的数据同步过程如下: (1)首先主节点启动,然后从属节点启动,从属节点会连接主节点并发送SYNC命令以请求同步 (2)主节点收到SYNC命令之后,就会执行BGSA

    2024年03月12日
    浏览(51)
  • Redis学习(八)Java三种方式实现分布式锁

    在分布式服务中,经常有例如 定时任务 这样的场景。 在定时任务中,如果不使用 quartz 这样的分布式定时工具,只是简单使用 @Schedule 注解来实现定时任务, 在服务分布式部署中 ,就有可能存在 定时任务并发重复执行问题 。 对于解决以上场景中的问题,我们引入了 分布式

    2024年02月12日
    浏览(45)
  • 详解redis的三种特殊数据类型

    14天学习训练营导师课程: 郑为中《Vue和SpringBoot打造假日旅社管理系统》 努力是为了不平庸~ 学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识点/题解/项目实操/遇到的bug/等等),在分享的同时加深对于知识点的理解,同时吸收他人

    2024年02月19日
    浏览(49)
  • 【征服redis14】认真理解一致性Hash与Redis的三种集群

    前面我们介绍了主从复制的方式和sentinel方式,这里我们看第三种模式-Cluster方式。 目录 1.前两种集群模式的特征与不足 2.Cluster模式 2.1 Cluster模式原理  2.2 数据分片与槽位 2.3 Cluster模式配置和实现 3.一致性Hash 3.1 哈希后取模 3.2 一致性Hash算法 4 Redis Cluster集群 主从复制是Red

    2024年01月22日
    浏览(52)
  • Redis的三种持久化策略及选取建议

    Redis是一个基于内存的高性能的键值型数据库,它支持三种不同的持久化策略:RDB(快照)、AOF(追加文件)、混合。这三种策略各有优缺点,需要根据不同的场景和需求进行选择和配置。本文将介绍这三种策略 RDB 持久化策略是指在 一定的时间间隔内 ,将 Redis 内存中的数据

    2024年02月04日
    浏览(55)
  • Redis数据一致性问题的三种解决方案

    Redis(Remote Dictionary Server ),是一个高性能的基于Key-Value结构存储的NoSQL开源数据库。大部分公司采用Redis来实现分布式缓存,用来提高数据查询效率。 在Web应用发展的初期,系统的访问和并发并不高,交互也比较少。但随着业务的扩大,访问量的提升,使得服务器负载和关系

    2024年02月14日
    浏览(38)
  • 脱离文档流的三种方法

            什么是脱离文档流呢?可以这样理解,本来这个标签是属于文档流管理的,那么它应该按照文档流的正常布局方式从左至右从上之下,并且符合标签本身的含义。         脱离文档流是指,这个标签脱离了文档流的管理。不受文档流的布局约束了,并且更重要

    2024年02月15日
    浏览(35)
  • 服务限流的六种方式

    服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它和熔断、降级搭配在一起使用,来避免瞬时的大量请求对系统造成负荷,来达到保护服务平稳运行的目的。下面就来看一看常见的6种限流方式,以及它们的实现与使用。 固定窗

    2024年02月10日
    浏览(34)
  • redis+lua实现限流

    2024年02月07日
    浏览(39)
  • 【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

       📝个人主页:哈__ 期待您的关注  本文介绍SpringBoot整合Redis并且进行接口的限流,文章主要介绍的是一种思想,具体代码还要结合实际。 Redis的解压包我放在了百度网盘上,有需要的可以下载。 Redis-x64-3.0.504 解压码:uhwj 我们在本地解压下载的Redis压缩包,打开解压后的

    2024年04月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包