Redis-Cell令牌桶限流详述(1)

Redis-Cell的GitHub地址:

https://github.com/brandur/redis-cell

Redis-Cell基于Rust语言开发,如果不想花费精力去搞Rust环境,那么可以直接下载与你的操作系统对应的安装包(这个很关键,我就安装了挺多次的,如果安装的问题比较多的话,也建议降低一个release版本!)

image.png

下载对应的安装包:

https://github.com/brandur/redis-cell/releases/download/v0.3.0/redis-cell-v0.3.0-armv7-unknown-linux-gnueabihf.tar.gz

image.png

如果不清楚自己的服务器(Linux)版本的,可以事先查看后再下载安装包:

# Linux 查看当前操作系统的内核信息

uname -a

# 查看当前操作系统系统的版本信息

cat /proc/version

image.png

2.2 安装&异常处理

  • 在Redis的安装目录的同级目录下,新建文件夹Redis-Cell,将压缩包上传后解压

tar -zxvf redis-cell-v0.2.5-powerpc64-unknown-linux-gnu.tar.gz

  • 解压后出现如下文件,复制libredis_cell.so文件的路径(pwd查看当前路径

image.png

  • 修改Redis配置文件,redis.conf,添加完成后记得保存后再退出

image.png

  • 重启Redis,如果启动正常,进入redis客户端,通过module list查看挂载的模块是否有Redis-Cell

image.png

  • 测试指令,出现如下情况说明集成Redis-Cell成功

image.png

  • 如果重启Redis后,客户端无法连接成功,说明Redis启动失败,这个时候我们需要查看Redis的启动日志,如果已经配置日志文件的可以直接查看日志定位问题,如果还未配置日志文件的需要先配置日志文件,redis.conf添加日志文件路径地址,再次重启,查看日志文件输出的错误日志

image.png

  • 错误可能千奇百怪,问题不大搞技术就不要心急,一个个解决,我这里记录下我最后遇到的问题,/lib64/libc.so.6: version `GLIBC_2.18‘ not found

43767:M 08 Sep 2021 21:39:39.643 # Module /usr/local/soft/Redis-Cell-0.3.0/libredis_cell.so failed to load: /lib64/libc.so.6: version `GLIBC_2.18’ not found (required by /usr/local/soft/Redis-Cell-0.3.0/libredis_cell.so)

43767:M 08 Sep 2021 21:39:39.643 # Can’t load module from /usr/local/soft/Redis-Cell-0.3.0/libredis_cell.so: server aborting

  • 缺失GLIBC_2.18,那就安装它(最后两个编译的过程时间比较长,耐心等待几分钟)

yum install gcc

wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz

tar zxf glibc-2.18.tar.gz

cd glibc-2.18/

mkdir build

cd build/

…/configure --prefix=/usr

make -j4

make install

  • 安装完成后,重启Redis,测试是否安装成功,循环上面的过程,通过日志分析错误即可

3、CL.THROTTLE指令


指令CL.THROTTLE参数含义

CL.THROTTLE liziba  10  5 60 1

▲     ▲  ▲  ▲ ▲

|     |  |  | └───── apply 1 token (default if omitted) (本次申请一个token)

|     |  └──┴─────── 5 tokens / 60 seconds  (60秒添加5个token到令牌桶中)

|     └───────────── 10 max_burst    (最大的突发请求,不是令牌桶的最大容量)

└─────────────────── key “liziba” (限流key)

输出参数值含义

127.0.0.1:6379> cl.throttle liziba 10 5 60 1

1) (integer) 0                    # 当前请求是否被允许,0表示允许,1表示不允许

2) (integer) 11                    # 令牌桶的最大容量,令牌桶中令牌数的最大值

3) (integer) 10                  # 令牌桶中当前的令牌数

4) (integer) -1                    # 如果被拒绝,需要多长时间后在重试,如果当前被允许则为-1

5) (integer) 12                    # 多长时间后令牌桶中的令牌会满

这里唯一有歧义的可能是max_burst,这个并不是令牌桶的最大容量,从作者的README.md中的解释也可以看出来

The total limit of the key (max_burst + 1). This is equivalent to the common X-RateLimit-Limit HTTP header.

image.png

4、Java调用Redis-Cell模块实现限流


4.1 导入依赖

io.lettuce

lettuce-core

5.3.4.RELEASE

io.netty

netty-buffer

io.netty

netty-common

io.netty

netty-codec

io.netty

netty-transport

4.2 实现代码

Redis命令接口定义:

package com.lizba.redis.limit.tokenbucket;

import io.lettuce.core.dynamic.Commands;

import io.lettuce.core.dynamic.annotation.Command;

import java.util.List;

/**

*      Redis命令接口定义

* @Author: Liziba

* @Date: 2021/9/8 23:50

*/

public interface IRedisCommand extends Commands {

/**

* 定义限流方法

* @param key           限流key

* @param maxBurst      最大的突发请求,桶容量等于maxBurst + 1

* @param tokens        tokens 与 seconds 是组合参数,表示seconds秒内添加个tokens

* @param seconds       tokens 与 seconds 是组合参数,表示seconds秒内添加个tokens

* @param apply         当前申请的token数

* @return

*/

@Command(“CL.THROTTLE ?0 ?1 ?2 ?3 ?4”)

List throttle(String key, long maxBurst, long tokens, long seconds, long apply);

}

Redis-Cell令牌桶限流类定义:

package com.lizba.redis.limit.tokenbucket;

import io.lettuce.core.RedisClient;

import io.lettuce.core.api.StatefulRedisConnection;

import io.lettuce.core.dynamic.RedisCommandFactory;

import java.util.List;

/**

*      Redis-Cell令牌桶限流

* @Author: Liziba

* @Date: 2021/9/8 23:47

*/

public class TokenBucketRateLimiter {

private static final String SUCCESS = “0”;

private RedisClient client;

private StatefulRedisConnection<String, String> connection;

private IRedisCommand command;

public TokenBucketRateLimiter(RedisClient client) {

this.client = client;

this.connection = client.connect();

this.command = new RedisCommandFactory(connection).getCommands(IRedisCommand.class);

}

/**

* 请是否被允许

* @param key

* @param maxBurst

* @param tokens

* @param seconds

* @param apply

* @return

*/

public boolean isActionAllowed(String key, long maxBurst, long tokens, long seconds, long apply) {

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-QhngINCD-1715762845403)]

[外链图片转存中…(img-LKjmdNO4-1715762845404)]

[外链图片转存中…(img-kGaxJyJ9-1715762845405)]

[外链图片转存中…(img-TUyWgyez-1715762845406)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值