Redis-Cell的GitHub地址:
Redis-Cell基于Rust语言开发,如果不想花费精力去搞Rust环境,那么可以直接下载与你的操作系统对应的安装包(这个很关键,我就安装了挺多次的,如果安装的问题比较多的话,也建议降低一个release版本!)
下载对应的安装包:
如果不清楚自己的服务器(Linux)版本的,可以事先查看后再下载安装包:
# Linux 查看当前操作系统的内核信息
uname -a
# 查看当前操作系统系统的版本信息
cat /proc/version
2.2 安装&异常处理
- 在Redis的安装目录的同级目录下,新建文件夹Redis-Cell,将压缩包上传后解压
tar -zxvf redis-cell-v0.2.5-powerpc64-unknown-linux-gnu.tar.gz
- 解压后出现如下文件,复制libredis_cell.so文件的路径(pwd查看当前路径
- 修改Redis配置文件,redis.conf,添加完成后记得保存后再退出
- 重启Redis,如果启动正常,进入redis客户端,通过module list查看挂载的模块是否有Redis-Cell
- 测试指令,出现如下情况说明集成Redis-Cell成功
- 如果重启Redis后,客户端无法连接成功,说明Redis启动失败,这个时候我们需要查看Redis的启动日志,如果已经配置日志文件的可以直接查看日志定位问题,如果还未配置日志文件的需要先配置日志文件,redis.conf添加日志文件路径地址,再次重启,查看日志文件输出的错误日志
- 错误可能千奇百怪,问题不大搞技术就不要心急,一个个解决,我这里记录下我最后遇到的问题,/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.
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) {
最后
答应大伙的备战金三银四,大厂面试真题来啦!
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析
资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
表重要推荐指数
[外链图片转存中…(img-7Gfs8Wyy-1715003294276)]
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
[外链图片转存中…(img-fjBPcsCY-1715003294278)]
腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析
[外链图片转存中…(img-0C8ytkcb-1715003294280)]
资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!