首页 教程 服务器/数据库 【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

 📝个人主页:哈__

期待您的关注 

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

目录

一、Windows安装Redis

二、启动Redis

三、SpringBoot整合Redis 

1.引入依赖 

2.添加配置文件application.yml

3.创建RedisController

四、Redis限流的几种方法 

1.基于Redis的数据结构zset(滑动窗口)

 2.基于Redis的令牌桶算法


本文介绍SpringBoot整合Redis并且进行接口的限流,文章主要介绍的是一种思想,具体代码还要结合实际。

一、Windows安装Redis

Redis的解压包我放在了百度网盘上,有需要的可以下载。

Redis-x64-3.0.504 解压码:uhwj

二、启动Redis

我们在本地解压下载的Redis压缩包,打开解压后的目录,首先启动redis-server.exe,之后在启动redis-cli.exe。

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

启动成功截图如下。

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

三、SpringBoot整合Redis 

1.引入依赖 

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>

2.添加配置文件application.yml

 我们并没有设置密码所以不用配置。

spring: redis: host: 127.0.0.1 port: 6379

3.创建RedisController

我们现在是介绍思想,所以传入了一个用户的id来判断是哪一个用户访问的接口。我们对redis中保存的key为用户id的键值对进行一个自增操作,然后返回这个自增后的值,这个值代表的就是我们在十秒钟内访问接口的次数。每次访问我们都重新设置这个键值对的有效时间,如果值大于5说明我们访问的次数已经达到了系统对个人十秒钟内访问次数的限制了,就不可以执行我们的业务逻辑。

@Resource private RedisTemplate<String, String> redisTemplate; @GetMapping("/test2") public String test2(String id){ Long increment = redisTemplate.opsForValue().increment(id); redisTemplate.expire(id,10,TimeUnit.SECONDS); if(increment > 5){ return "不可以访问,访问次数为"+increment; } return "可以访问,访问次数为"+increment; }

之后启动我们的SpringBoot项目。我这里使用的是PostMan进行的接口测试。

进行第一次访问。

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

第二次。

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

第五次 。

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

第六次。第六次可以看到接口的返回值为不可以访问,说明我们的访问次数已经上限了,这时候就要等十秒后再次访问了。

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

四、Redis限流的几种方法 

1.基于Redis的数据结构zset(滑动窗口)

思想比较容易接收,我们定一个这样一个key为limit的列表,每当我们发送一次请求的时候,我们向这个列表当中添加当前的时间戳(前提是没有被限流),当然,在我们进行数据的添加之前需要进行是否需要进行限流。我们设定intervalTime为限流的时间间隔,我们从limit列表中获取我们访问接口的时间currentTIme-intervalTime,这样我们判断一下(currentTIme-intervalTime,currentTime)范围内的时间戳个数,也就是我们请求的次数,这样就能判断是否超过限制了。这里我用一张图来表示。

既然叫做滑动窗口,那这个窗口的大小就是我们进行限流的时间间隔,这个窗口在我们的时间轴上进行移动。

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

代码如下:

@GetMapping("/test3") public String test3(){ int intervalTime = 10; Long currentTime = new Date().getTime(); if(Boolean.TRUE.equals(redisTemplate.hasKey("limit"))) { Integer count = Objects.requireNonNull(redisTemplate.opsForZSet().rangeByScore("limit", currentTime - intervalTime, currentTime)).size(); if (count != null && count > 5) { return "每分钟最多只能访问5次"; } } redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(),currentTime); return "访问成功"; }

 2.基于Redis的令牌桶算法

这个就好理解了,一个筐子里十个苹果大家都去拿,拿到了就可以吃,拿不到就等着别人放。在Redis里我们在一个列表里放令牌,用户访问接口去尝试拿这个令牌,拿到了就能访问接口,拿不到就进行限流,当然除了拿令牌之外还放令牌,我们通过定时任务向列表内放令牌。

@GetMapping("/test3") public String test3(){ Object result = redisTemplate.opsForList().leftPop("limit_list"); if(result == null){ return "当前令牌桶中无令牌,无法访问"; } return "访问成功"; } @Scheduled(fixedDelay = 100,initialDelay = 0) public void setLimitListTask(){ redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString()); }

定时任务到底如何使用,大家可以自行搜索一下。还有一些其他的方式本文就不在介绍了。

评论(0)条

提示:请勿发布广告垃圾评论,否则封号处理!!

    猜你喜欢
    【MySQL】用户管理

    【MySQL】用户管理

     服务器/数据库  2个月前  2.18k

    我们推荐使用普通用户对数据的访问。而root作为管理员可以对普通用户对应的权限进行设置和管理。如给张三和李四这样的普通用户权限设定后。就只能操作给你权限的库了。

    Cursor Rules 让开发效率变成10倍速

    Cursor Rules 让开发效率变成10倍速

     服务器/数据库  2个月前  1.24k

    在AI与编程的交汇点上,awesome-cursorrules项目犹如一座灯塔,指引着开发者们驶向更高效、更智能的编程未来。无论你是经验丰富的老手,还是刚入行的新人,这个项目都能为你的编程之旅增添一抹亮色。这些规则文件就像是你私人定制的AI助手,能够根据你的项目需求和个人偏好,精确地调教AI的行为。突然间,你会发现AI不仅能理解Next.js的最佳实践,还能自动应用TypeScript的类型检查,甚至主动提供Tailwind CSS的类名建议。探索新的应用场景,推动AI辅助编程的边界。

    探索Django 5: 从零开始,打造你的第一个Web应用

    探索Django 5: 从零开始,打造你的第一个Web应用

     服务器/数据库  2个月前  1.16k

    Django 是一个开放源代码的 Web 应用程序框架,由 Python 写成。它遵循 MVT(Model-View-Template)的设计模式,旨在帮助开发者高效地构建复杂且功能丰富的 Web 应用程序。随着每个版本的升级,Django 不断演变,提供更多功能和改进,让开发变得更加便捷。《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体,是一本从零基础到精通Django Web企业级开发技术的实战指南《Django 5 Web应用开发实战》内容以。

    MySQL 的mysql_secure_installation安全脚本执行过程介绍

    MySQL 的mysql_secure_installation安全脚本执行过程介绍

     服务器/数据库  2个月前  1.09k

    mysql_secure_installation 是 MySQL 提供的一个安全脚本,用于提高数据库服务器的安全性

    【MySQL基础篇】概述及SQL指令:DDL及DML

    【MySQL基础篇】概述及SQL指令:DDL及DML

     服务器/数据库  2个月前  491

    数据库是长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库不仅仅是数据的简单堆积,而是遵循一定的规则和模式进行组织和管理的。数据库中的数据可以包括文本、数字、图像、音频等各种类型的信息。

    Redis中的哨兵(Sentinel)

    Redis中的哨兵(Sentinel)

     服务器/数据库  2个月前  316

    ​ 上篇文章我们讲述了Redis中的主从复制(Redis分布式系统中的主从复制-CSDN博客),本篇文章针对主从复制中的问题引出Redis中的哨兵,希望本篇文章会对你有所帮助。