简言

1. redis使用有序集合zset也能实现简单的限流,但是只能处理几十,几百的量级,因为zset需要记录每一条信息,很占据空间。要想处理更大数量级的限流,必须使用其他方法

2. 通常的限流算法有两种,漏斗算法,令牌桶算法,本篇博客要讲的redis-cell是使用令牌桶算法实现的

3. redis-cell的官方地址:https://github.com/brandur/redis-cell

4. redis-cell只有一个命令 cl.throttle,使用很简单,需要注意的是最后一个参数为正时表取出令牌,为负时表放入令牌,不填时默认为1

5. 《Redis深度历险》一书中对redis-cell的介绍是错误的,书中以为 cl.throttle 设置的是容量,其实不然,设置的是 “容量-1”,比如设置99时,容量则为100

安装(由于redis-cell是使用rust语言编写的,而本人对rust毫无研究,也不想去部署rust的环境,所以直接下载编译好的动态库so文件,不再源码编译)

1.打开地址:https://github.com/brandur/redis-cell/releases,挑选适合自己环境的压缩包,下载最新的,本人是ubuntu环境,下载linux版的即可,下载到/usr/local/redis/redis-stable目录,并解压

2. 修改要使用的redis.conf文件,添加一行 loadmodule /usr/local/redis/redis-stable/libredis_cell.so,保存后,重启redis即可

3. 连接进我们的redis,运行命令 module list ,可以查看目前已经启用的module

使用

如上面简言所述,redis-cell使用很简单,只有一个命令

命令格式:cl.throttle  key名字   令牌桶容量-1   令牌产生个数   令牌产生时间 本次取走的令牌数 (不写时默认1,负值表放入令牌)

返回格式:0成功,1失败

                   令牌桶的容量

                   当前桶内剩余的令牌数

                   成功时该值为-1,失败时表还需要等待多少秒可以有足够的令牌

                   表预计多少秒后令牌桶会满

示例1(key:mybag,该key不存在时会新建,容量为100(也就是99+1=100), 每10秒产生1个令牌,本次取出40个)

127.0.0.1:6379> cl.throttle mybag 99 1 10 40
1) (integer) 0
2) (integer) 100
3) (integer) 60
4) (integer) -1
5) (integer) 400

0表示取出成功,100表令牌桶容量,60表桶内剩余令牌数,-1表成功即本次取令牌不需等待,400表预计还需要400秒令牌桶会满,根据我们的速度设定,每10秒产生一个令牌,确实是需要400秒

示例2(从mybag的令牌桶中再取出40个)

127.0.0.1:6379> cl.throttle mybag 99 1 10 40
1) (integer) 0
2) (integer) 100
3) (integer) 20
4) (integer) -1
5) (integer) 798
127.0.0.1:6379> cl.throttle mybag 99 1 10 40
1) (integer) 1
2) (integer) 100
3) (integer) 20
4) (integer) 196
5) (integer) 796

第一次的0表示取出成功,100表令牌桶容量,20表桶内剩余令牌数,-1表成功即本次取令牌不需等待,798表预计还需要798秒令牌桶会满

第二次的1表示取出失败,100表令牌桶容量,20表桶内剩余令牌数,196表失败,还需要等待196秒可以重试本次操作,796表预计还需要796秒令牌桶会满

示例3(往mybag的令牌桶中先放入40个,再取出40个)

127.0.0.1:6379> cl.throttle mybag 99 1 10 -40
1) (integer) 0
2) (integer) 100
3) (integer) 126
4) (integer) -1
5) (integer) -262
127.0.0.1:6379> cl.throttle mybag 99 1 10 40
1) (integer) 0
2) (integer) 100
3) (integer) 60
4) (integer) -1
5) (integer) 400

放入40个时,0表放入成功,126就没啥意义了,因为最大容量才100,当然桶内不可能有126个;-262更诡异了,桶满了就满了呗,干嘛告诉我需要负262秒呢,感觉桶满时0更准确

我们验证前面的猜想,马上再取出40个可以看到结果值0表成功,60表桶内还剩下60个令牌,即容量100减去本次的40得到,也就验证了第一次返回的126毫无意义

令牌桶限流之redis-cell的安装,使用,详解相关推荐

  1. ASP.NET Core中使用令牌桶限流

    在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量. 比如限流每秒100次请求,绝大多数的时间里都不会超过这个数,但是偶尔某 ...

  2. Jedis使用lua脚本完成令牌桶限流

    Jedis使用lua脚本完成令牌桶限流 文章目录 Jedis使用lua脚本完成令牌桶限流 一.lua脚本的简单语法 二.令牌桶限流 1. 构思 2. 实现 三.Jemeter压测工具测试 一.lua脚 ...

  3. 可能要用心学高并发核心编程,限流原理与实战,分布式令牌桶限流

    实战:分布式令牌桶限流 本节介绍的分布式令牌桶限流通过Lua+Java结合完成,首先在Lua脚本中完成限流的计算,然后在Java代码中进行组织和调用. 分布式令牌桶限流Lua脚本 分布式令牌桶限流Lu ...

  4. 【秒杀系统】零基础上手秒杀系统(二):令牌桶限流 + 再谈超卖

    前言 本文是秒杀系统的第二篇,通过实际代码讲解,帮助你快速的了解秒杀系统的关键点,上手实际项目. 本篇主要讲解接口限流措施,接口限流其实定义也非常广,接口限流本身也是系统安全防护的一种措施,暂时列举这 ...

  5. 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?

    什么是限流?为什么会限流呢?常见的限流算法[固定窗口限流.滑动窗口限流.漏桶限流.令牌桶限流]是什么呢? 什么是限流? 为什么会限流? 1. 固定窗口限流算法 1.1 什么是固定窗口限流算法 1.2 ...

  6. 我们公司使用了 5 年的系统限流方案 ,从实现到部署实战详解,稳的一B

    前言 最近几年,随着微服务的流行,服务和服务之间的依赖越来越强,调用关系越来越复杂,服务和服务之间的稳定性越来越重要.在遇到突发的请求量激增,恶意的用户访问,亦或请求频率过高给下游服务带来较大压力时, ...

  7. 十三水算法php_基于PHP+Redis令牌桶限流

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...

  8. php限制接口访问次数_令牌桶限流思路分享(PHP+Redis实现机制)

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...

  9. 基于Redis和 Lua 实现分布式令牌桶限流

    rpc-tech-stack 系列的实践文章 ~ 本文属于限流话题. 限流是一个很大的话题,准备把其中的所有限流器都实现一遍,以此也算全都写过了,到时候再用也不至于会心虚,毕竟真实写完成过.本文主要讲 ...

  10. 分布式限流实战--redis实现令牌桶限流

    这篇文章我们主要是分析一下分布式限流的玩法. 因为限流也是一个经典用法了. 1.微服务限流 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.缓存.降级和限流是保护微服务系统运行稳定性的三大利器 ...

最新文章

  1. 【Qt】QtCreator updatePchInfo:switching to none
  2. 聊聊lettuce的shareNativeConnection参数
  3. java中获取当前服务器的Ip地址
  4. 【最佳解法】剑指 Offer 25. 合并两个排序的链表
  5. java 锁_Java之线程并发的各种锁、锁、锁
  6. 人工智障学习笔记——深度学习(1)神经网络
  7. 数学(FFT):BZOJ 3527 [Zjoi2014]力
  8. 机器人 知乎碧桂园_杨国强森林城市与机器人跃进后的“梦醒时分”
  9. easyui模版html,EasyUI 模板(Template)_Vue EasyUI Demo
  10. 3dsmax展uv_TexTools|3dmax展UV插件(TexTools for 3ds Max)下载v4.10免费版 - 欧普软件下载
  11. mysql多表关联数据删除
  12. vCenter Server 相关介绍
  13. prometheus常用函数详解
  14. 终于有人把元数据讲明白了
  15. 微信小程序开发者工具使用vant组件
  16. Excel文件损坏打不开的常见原因及解决方法
  17. 开关电源(Switch Regulator)---Buck
  18. pixhawk飞控解锁方法
  19. 876链表的中间节点
  20. Linux ❀ KickStart-无人值守部署

热门文章

  1. [转]VSTO Office二次开发应用程序键盘鼠标钩子
  2. REVIT模型之机器人瓦力
  3. 2021牛客多校7 - xay loves monotonicity(线段树区间合并)
  4. POJ - 3190 Stall Reservations(贪心+优先队列优化)
  5. SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)
  6. CodeForces - 353E Antichain(贪心+思维)
  7. 安卓系统手机软件_2M不到的安卓神器!有了这五款软件,iphone用户都羡慕
  8. python算法题-汉诺塔问题递归解法(python实现)
  9. codeforces contest 1119
  10. 斐波那契数拓展问题:leetcode-70 爬楼梯问题 leetcode-1137 泰波那契数问题解法