iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >利用Redis实现访问次数限流的方法详解
  • 181
分享到

利用Redis实现访问次数限流的方法详解

2024-04-02 19:04:59 181人浏览 薄情痞子
摘要

假设我们要做一个业务需求,这个需求就是限制用户的访问频次。比如1分钟内只能访问20次,10分钟内只能访问200次。因为是用户维度的场景,性能肯定是要首先考虑,那么适合这个场景的非Re

假设我们要做一个业务需求,这个需求就是限制用户的访问频次。比如1分钟内只能访问20次,10分钟内只能访问200次。因为是用户维度的场景,性能肯定是要首先考虑,那么适合这个场景的非Redis莫属。

最简单的实现,莫过于只是用incr进行计数操作,于是有了下面的代码:


long count = redisTemplate.opsForValue().increment("user:1:60");
if (count > maxLimitCount) {
   throw new LimitException("访问太频繁");
}

count = redisTemplate.opsForValue().increment("user:1:600");
if (count > maxLimitCount) {
   throw new LimitException("访问太频繁");
}

来,我们对上面这段代码解读一下。需求有2个时间维度的限制,所以这边基于用户和时间维度构建了Redis的Key。然后对每个Key进行计数,计数后的结果用于跟限制的值进行判断,如果超出了限制的值就抛出异常。

假设限制的时间场景有10个呢?那上面的代码是不是得写10遍才可以。有人可能会说,这还不简单吗?循环呀,循环确实能够解决这个问题。但是大家有没有去思考,这是用户维度的请求,如果每个请求里面都去操作10次Redis的话,这耗时至少也得10来毫秒吧。所以问题在这,并不是说这个逻辑实现的有问题。

那我们就改成批量的吧,用pipeline来批量执行。

redisTemplate.execute(new RedisCallback<Long>() {
    @Override
    public Long doInRedis(RedisConnection connection) throws DataAccessException {
        connection.openPipeline();
        connection.incr("user:1:60".getBytes());
        connection.incr("user:1:600".getBytes());
        onnection.closePipeline();
        return null;
    }
});

用pipeline也有一个问题,那就是拿不到返回值,也就只能增加,但是没办法判断是否超过了限制的阀值。

所以需要在第一步先查询下,用查到的值进行判断,这样也就是只需要和Redis交互两次就可以了。

上面的代码在单节点下没问题,但是如果在集群下,其实每个Key都可能分配到不同的节点上去,只不过是底层帮你屏蔽掉了细节,并发执行,拿到了所有结果后合并返回的。所以我们需要让所有的Key都路由到一个节点上,本来就是用户维度的,直接使用userId路由即可。

这个时候Redis的HashTag功能就排上用场了,将Key user:1:600改写成user:{1}:600 。

虽然已经优化了,但是还是要发起两次网络请求才能完成这个逻辑,有没有可能再进一步优化下呢?一次请求行不行。

这个时候要放大招了,lua脚本走起,将所有逻辑都放入Lua脚本中,一次网络交互即可完成。

local current
current = redis.call("incr",KEYS[1])
if current == 1 then
    redis.call("expire",KEYS[1],1)
end

if current > ARGV[1]
  return 1
end

return 0

上面脚本演示了如何对一个Key进行处理,返回1表示限流,返回0表示通过。不过使用lua脚本的时候要注意,某些云服务的Redis会对脚本进行校验,像Redis的Key不能使用变量,必须用KEYS[下标]的方式,所以这里操作多个Key还不能用循环,代码得写多遍,这是一个恶心的点。

总结

到此这篇关于利用Redis实现访问次数限流的文章就介绍到这了,更多相关Redis访问次数限流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用Redis实现访问次数限流的方法详解

本文链接: https://www.lsjlt.com/news/139963.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用Redis实现访问次数限流的方法详解
    假设我们要做一个业务需求,这个需求就是限制用户的访问频次。比如1分钟内只能访问20次,10分钟内只能访问200次。因为是用户维度的场景,性能肯定是要首先考虑,那么适合这个场景的非Re...
    99+
    2024-04-02
  • 详解Redis实现限流的三种方式
     面对越来越多的高并发场景,限流显示的尤为重要。       当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三...
    99+
    2024-04-02
  • redis 实现登陆次数限制的思路详解
    title: redis-login-limitation  利用 redis 实现登陆次数限制, 注解 + aop, 核心代码很简单. 基本思路 比如希望达到的要求是这样: 在 1min 内登...
    99+
    2024-04-02
  • 使用Java实现Redis限流的方法
    1、概述   限流的含义是在单位时间内确保发往某个模块的请求数量小于某个数值,比如在实现秒杀功能时,需要确保在10秒内发往支付模块的请求数量小于500个。限流...
    99+
    2024-04-02
  • Redis限流的实现方法有哪些
    本篇内容主要讲解“Redis限流的实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis限流的实现方法有哪些”吧!一、简单的限流基本原理当系统处理能力有限,如何组织计划外的请求对...
    99+
    2023-06-22
  • 使用AOP+redis+lua做方法限流的实现
    目录需求实现方式源码Limit 注解LimitKeyLimitTypeRedisLimiterHelperLimitInterceptorTestService需求 公司里使用One...
    99+
    2024-04-02
  • Java限流实现的几种方法详解
    目录计数器信号量滑动窗口漏桶令牌桶测试示例代码计数器 计数器限流方式比较粗暴,一次访问就增加一次计数,在系统内设置每 N 秒的访问量,超过访问量的访问直接丢弃,从而实现限流访问。 具...
    99+
    2022-12-03
    Java限流 Java限流算法 Java限流方案
  • Redis实现限流器的方法有哪些
    这篇文章主要介绍了Redis实现限流器的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis实现限流器的方法有哪些文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • Springboot使用redis实现接口Api限流的方法
    这篇文章主要介绍“Springboot使用redis实现接口Api限流的方法”,在日常操作中,相信很多人在Springboot使用redis实现接口Api限流的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-20
  • Redis实现限流器的三种方法(小结)
    目录方法一:基于Redis的setnx的操作方法二:基于Redis的数据结构zset方法三:基于Redis的令牌桶算法方法一:基于Redis的setnx的操作 我们在使用Redis的...
    99+
    2024-04-02
  • 基于Redis实现分布式应用限流的方法
    限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实...
    99+
    2023-05-30
    redis 限流 流的
  • 利用Android实现光影流动特效的方法详解
    目录前言MaskFilter 类简介MaskFilter 的几种效果对比光影流动光影流动效果1光影流动效果2光影流动效果3光影流动效果4:光影沿贝塞尔曲线流动总结前言 Flutter...
    99+
    2024-04-02
  • SpringBoot使用AOP实现统计全局接口访问次数详解
    目录AOP是什么AOP的作用和优势常见的动态代理技术AOP相关概念实现AOP是什么 AOP(Aspect Oriented Programming),也就是面向切面编程,是通过预编译...
    99+
    2024-04-02
  • 使用SpringBoot + Redis 实现接口限流的方式
    目录配置限流注解定制 RedisTemplateLua 脚本注解解析接口测试全局异常处理Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了...
    99+
    2024-04-02
  • Go官方限流器的用法详解
    目录限流器的内部结构构造限流器使用限流器Wait/WaitNAllow/AllowNReserve/ReserveN动态调整速率和桶大小总结限流器是提升服务稳定性的非常重要的组件,可...
    99+
    2024-04-02
  • SpringBoot中自定义注解实现控制器访问次数限制实例
    今天给大家介绍一下SpringBoot中如何自定义注解实现控制器访问次数限制。在Web中最经常发生的就是利用恶性URL访问刷爆服务器之类的攻击,今天我就给大家介绍一下如何利用自定义注解实现这类攻击的防御操作。其实这类问题一般的解决思路就是:...
    99+
    2023-05-31
    spring 控制器 制器
  • 基于Redis如何实现每日登录失败次数限制的方法
    这篇文章主要介绍基于Redis如何实现每日登录失败次数限制的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 思路下面是我以前写的代码,没考虑高并发场景。如果是高并发场景下,要...
    99+
    2024-04-02
  • Python利用flask操作Redis的方法详解
    目录简单示例python flask 操作 Redis 更多内容通过 Flask 存储字符串、列表和字典使用 Flask 操作 Redis 可以通过安装 Redis 的 Python...
    99+
    2023-02-01
    Python flask操作Redis Python flask Redis Python 操作Redis
  • 详解基于redis实现的四种常见的限流策略
    目录一、引言二、固定时间窗口算法三、滑动时间窗口算法四、漏桶算法五、令牌桶算法一、引言 在web开发中功能是基石,除了功能以外运维和防护就是重头菜了。因为在网站运行期间可能...
    99+
    2024-04-02
  • 如何利用VB.NET数据库访问方法封装到类实现
    这期内容当中小编将会给大家带来有关如何利用VB.NET数据库访问方法封装到类实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我们都知道,线程要执行的方法不能接受任何参数,如果要传入方法特定条件,可以将方...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作