广告
返回顶部
首页 > 资讯 > 精选 >redis如何实现分布式限流
  • 236
分享到

redis如何实现分布式限流

redis 2023-09-09 14:09:09 236人浏览 安东尼
摘要

Redis可以使用令牌桶算法来实现分布式限流。令牌桶算法是一种常用的限流算法,它通过维护一个固定容量的令牌桶,每秒钟往桶里放入一定数

Redis可以使用令牌桶算法来实现分布式限流。令牌桶算法是一种常用的限流算法,它通过维护一个固定容量的令牌桶,每秒钟往桶里放入一定数量的令牌。当请求到达时,如果令牌桶中有足够的令牌,那么允许请求通过并消耗一个令牌;如果令牌桶中没有足够的令牌,则拒绝请求。
以下是使用Redis实现分布式限流的步骤:
1. 使用Redis的lua脚本编写一个令牌桶算法的限流器。Lua脚本可以在Redis服务器端执行,可以保证原子性。以下是一个简单的令牌桶算法的Lua脚本示例:
```lua
local key = KEYS[1]
local capacity = tonumber(ARGV[1])
local rate = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local tokens_key = key .. ":tokens"
local timestamp_key = key .. ":timestamp"
local tokens = tonumber(redis.call("get", tokens_key))
if not tokens then
tokens = capacity
end
local last_refreshed = tonumber(redis.call("get", timestamp_key))
if not last_refreshed then
last_refreshed = now
end
local delta = math.max(0, now - last_refreshed)
local filled_tokens = math.min(capacity, tokens + delta * rate)
local allowed = filled_tokens >= 1
local new_tokens = filled_tokens
local new_timestamp = last_refreshed
if allowed then
new_tokens = filled_tokens - 1
new_timestamp = now
end
redis.call("set", tokens_key, new_tokens)
redis.call("set", timestamp_key, new_timestamp)
return allowed
```
2. 在代码中调用该Lua脚本,传入限流器的唯一标识符、限流器的容量、限流器的速率以及当前时间戳作为参数,获取限流结果。
```java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class RedisRateLimiter {
private JedisPool jedisPool;
public RedisRateLimiter(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
public boolean allowRequest(String key, int capacity, int rate) {
try (Jedis jedis = jedisPool.getResource()) {
long now = System.currentTimeMillis();
Object result = jedis.eval(
"local key = KEYS[1]\n" +
"local capacity = tonumber(ARGV[1])\n" +
"local rate = tonumber(ARGV[2])\n" +
"local now = tonumber(ARGV[3])\n" +
"\n" +
"local tokens_key = key .. \":tokens\"\n" +
"local timestamp_key = key .. \":timestamp\"\n" +
"\n" +
"local tokens = tonumber(redis.call(\"get\", tokens_key))\n" +
"if not tokens then\n" +
" tokens = capacity\n" +
"end\n" +
"\n" +
"local last_refreshed = tonumber(redis.call(\"get\", timestamp_key))\n" +
"if not last_refreshed then\n" +
" last_refreshed = now\n" +
"end\n" +
"\n" +
"local delta = math.max(0, now - last_refreshed)\n" +
"local filled_tokens = math.min(capacity, tokens + delta * rate)\n" +
"local allowed = filled_tokens >= 1\n" +
"\n" +
"local new_tokens = filled_tokens\n" +
"local new_timestamp = last_refreshed\n" +
"if allowed then\n" +
" new_tokens = filled_tokens - 1\n" +
" new_timestamp = now\n" +
"end\n" +
"\n" +
"redis.call(\"set\", tokens_key, new_tokens)\n" +
"redis.call(\"set\", timestamp_key, new_timestamp)\n" +
"\n" +
"return allowed",
1,
key,
Integer.toString(capacity),
Integer.toString(rate),
Long.toString(now)
);
return (Boolean) result;
}
}
}
```
3. 在需要进行限流的地方调用RedisRateLimiter的allowRequest方法进行

--结束END--

本文标题: redis如何实现分布式限流

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

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

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

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

下载Word文档
猜你喜欢
  • redis如何实现分布式限流
    Redis可以使用令牌桶算法来实现分布式限流。令牌桶算法是一种常用的限流算法,它通过维护一个固定容量的令牌桶,每秒钟往桶里放入一定数...
    99+
    2023-09-09
    redis
  • 利用Redis实现分布式限流
    标题:利用Redis实现分布式限流正文:随着互联网的快速发展,网站和服务的并发访问量不断增加,为了保护后端系统的稳定性,限制并发访问量成为了一项重要的任务。在分布式系统中,为了保证多个服务实例之间的共享状态,我们可以使用Redis作为分布式...
    99+
    2023-11-07
    分布式 redis 限流
  • Redis和Lua实现分布式限流器
    本篇文章为大家展示了Redis和Lua实现分布式限流器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。原理计数器算法是指在一段窗口时间内允许通过的固定数量的请求, 比...
    99+
    2022-10-18
  • SpringBoot+Redis+Lua分布式限流的实现
    Redis支持LUA脚本的主要优势 LUA脚本的融合将使Redis数据库产生更多的使用场景,迸发更多新的优势: 高效性:减少网络开销及时延,多次redis服务器网络请求的操作,使用L...
    99+
    2022-11-13
    SpringBoot Redis Lua分布式限流 SpringBoot 分布式限流
  • 如何使用Redis实现分布式限流功能
    如何使用Redis实现分布式限流功能引言:随着互联网的快速发展,业务系统的访问量也日益增加。当流量集中到某一业务系统时,会给系统的稳定性和性能带来一定的威胁。为了保护业务系统,限流成为一种必不可少的手段。在分布式系统中,使用Redis可以方...
    99+
    2023-11-07
    分布式 redis 限流
  • kubernetes实现分布式限流
    目录一、概念1.1 使用场景1.2 维度1.3 分布式限流二、分布式限流常用方案三、基于kubernetes的分布式限流3.1 kubernetes中的副本数3.2 rateLimi...
    99+
    2022-11-13
  • 基于Redis实现分布式应用限流的方法
    限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实...
    99+
    2023-05-30
    redis 限流 流的
  • kubernetes怎么实现分布式限流
    本篇内容主要讲解“kubernetes怎么实现分布式限流”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“kubernetes怎么实现分布式限流”吧!一、概念限流(Ratelimiting)指对应用...
    99+
    2023-06-29
  • springboot+redis 实现分布式限流令牌桶的示例代码
    1、前言 网上找了很多redis分布式限流方案,要不就是太大,需要引入第三方jar,而且还无法正常运行,要不就是定时任务定时往key中放入数据,使用的时候调用,严重影响性能,所以着手...
    99+
    2022-11-12
  • redis分布式如何实现
    小编给大家分享一下redis分布式如何实现,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!一 为什么使用 Redis在项目中使用 Redis,主要考虑两个角度:性能和并发。如果只是为了分布式锁这...
    99+
    2022-10-18
  • Redis分布式限流组件设计与使用实例
    目录1.背景2.Redis计数器限流设计2.1Lua脚本2.2自定义注解2.3限流组件2.4限流切面实现3.测试一下3.1方法限流示例3.2动态入参限流示例4.其它扩展5.源码地址本...
    99+
    2022-11-12
  • 如何实现redis限流
    如何实现redis限流?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。redis限流的实现方式有3种,分别是:第一种:基于Redis的set...
    99+
    2022-10-18
  • redis如何实现限流
    redis实现限流的示例:使用接口实现,接口代码如下:#指定用户user_id的某个行为action_key在特定的时间内period只允许发生最多的次数max_countdef is_action_al lowed(u...
    99+
    2022-10-08
  • Redis如何实现分布式锁
    目录一、前言二、正文今天我们来聊一聊分布式锁的那些事。 相信大家对锁已经不陌生了,我们在多线程环境中,如果需要对同一个资源进行操作,为了避免数据不一致,我们需要在操作共享资源之前进行...
    99+
    2022-11-12
  • Redis分布式锁如何实现
    这篇文章将为大家详细讲解有关Redis分布式锁如何实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是分布式锁?要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、...
    99+
    2022-10-18
  • SpringBoot+Redis如何实现分布式锁
    这篇文章主要介绍了SpringBoot+Redis如何实现分布式锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。jedis的nx生成锁 如何删除锁 模拟抢...
    99+
    2023-06-16
  • 如何实现redis分布式缓存
    摘要: 第一:Redis 是什么? Redis是基于内存、可持久化的日志型、Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越...
    99+
    2022-10-18
  • Redis中如何实现分布式锁
    这篇文章给大家介绍Redis中如何实现分布式锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Redis要实现分布式锁,以下条件应该得到满足互斥性 在任意时刻,只有一个客户端能持有锁。不能死锁 客户端...
    99+
    2023-06-16
  • Redisson分布式限流的实现原理解析
    目录正文RRateLimiter使用RRateLimiter的实现RRateLimiter使用时注意事项RRateLimiter是非公平限流器Rate不要设置太大限流的上限取决于Redis单实例的性能分布式限流的本质正文...
    99+
    2023-02-12
    Redisson分布式限流 Redisson 分布式
  • Redis实现分布式锁
    单体锁存在的问题 在单体应用中,如果我们对共享数据不进行加锁操作,多线程操作共享数据时会出现数据一致性问题。 (下述实例是一个简单的下单问题:从redis中获取库存,检查库存是否够,>0才允许下单) 我们的解决办法通常是加锁。如下加单体锁...
    99+
    2023-08-16
    分布式 java jvm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作