redis的搭建及应用(七)-redis的限流插件redis-cell

Redis限流插件-redis-cell

redis-cell 是一个用rust语言编写的基于令牌桶算法的的限流模块,提供原子性的限流功能,并允许突发流量,可以很方便的应用于分布式环境中。

image-20231126175846605

下载redis-cell插件

访问Releases · brandur/redis-cell (github.com)

image-20231126171102106

上传redis-cell插件到linux服务器

image-20231126171232661

解压插件

[root@localhost plugin]# tar -zxvf redis-cell-v0.3.1-x86_64-unknown-linux-gnu.tar.gz 
libredis_cell.d
libredis_cell.so

拷贝libredis_cell.so到redis容器中

docker cp libredis_cell.so redis_6390:/usr/local/etc/redis

修改后redis.conf文件

在redis.conf配置文件中引用插件

38 ################################## MODULES #####################################
39 
40 # Load modules at startup. If the server is not able to load modules
41 # it will abort. It is possible to use multiple loadmodule directives.
42 #
43 # loadmodule /path/to/my_module.so
44 loadmodule /usr/local/etc/redis/libredis_cell.so
image-20231126171836524

插件使用

查询插件是否已启用

输入命令: module list

127.0.0.1:6379> module list
1) 1) "name"2) "redis-cell"3) "ver"4) (integer) 1
image-20231126173521851
语法
image-20231126173228028
127.0.0.1:6379> cl.throttle mytest 99 5 100 2
1) (integer) 0                        #0 表示成功, 1表示失败
2) (integer) 100                      # 令牌桶的容量
3) (integer) 98                       # 当前令牌桶的令牌数
4) (integer) -1                       # 成功时该值为-1,失败时表还需要等待多少秒可以有足够的令牌
5) (integer) 41                       # 预计多少秒后令牌桶会满
测试

多次从令牌桶取出数据

127.0.0.1:6379> cl.throttle mytest 99 5 100 40
1) (integer) 0
2) (integer) 100
3) (integer) 54
4) (integer) -1
5) (integer) 911
127.0.0.1:6379> cl.throttle mytest 99 5 100 40
1) (integer) 0
2) (integer) 100
3) (integer) 14
4) (integer) -1
5) (integer) 1708
127.0.0.1:6379> cl.throttle mytest 99 5 100 40
1) (integer) 1                      #失败,拒绝取出
2) (integer) 100
3) (integer) 14
4) (integer) 505                  # 取出失败,令牌桶还有14个令牌,还需505秒才能够取出
5) (integer) 1705

springboot使用令牌

引入redis
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
yml配置
server:port: 10022
spring:redis:host: 192.168.198.128port: 6390
redis配置
package com.wnhz.redis.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(factory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}
}
测试
    @PostMapping("/redisCell")public String redisCell() {String script = "return redis.call('cl.throttle',KEYS[1],ARGV[1],ARGV[2],ARGV[3],ARGV[4])";DefaultRedisScript<List<Long>> defaultRedisScript = new DefaultRedisScript<>();int maxBurst = 99;int countPerPeriod = 10;int period = 100;int quantity = 10;List<Long> retVal = redisTemplate.execute(new DefaultRedisScript<>(script, List.class),new ArrayList<String>() {{add("cell_key");}},maxBurst,countPerPeriod,period,quantity);System.out.println(retVal);if (1 == retVal.get(0)) {  //第一个返回为1,表示拒绝return "频繁访问服务器过载,请过一会再来";}return "SUCCESS";}

image-20231126182938870

运行结果 [0, 100, 90, -1, 101]

redis-cell封装

/*** @param key            redis key* @param maxBurst       令牌桶最大容量* @param countPerPeriod 通过的令牌桶数(countPerPeriod/period 速率)* @param period         时间* @param quantity       取出数量* @return List  返回集合中5个Long值*  第0个位置:  0 表示成功, 1表示失败*  第1个位置:  令牌桶的容量*  第2个位置:  当前令牌桶的令牌数*  第3个位置:  成功时该值为-1,失败时表还需要等待多少秒可以有足够的令牌*  第4个位置:  预计多少秒后令牌桶会满*/
public List<Long> redisCell(String key,String maxBurst,String countPerPeriod,String period,String quantity) {final String script = "return redis.call('cl.throttle',KEYS[1],ARGV[1],ARGV[2],ARGV[3],ARGV[4])";connect();List<Long> eval = this.connection.sync().eval(script, ScriptOutputType.MULTI,new String[]{key},maxBurst,countPerPeriod,period,quantity);returnPool();return eval;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络——应用层与网络安全(六)

前言&#xff1a; 前几章我们已经对TCP/IP协议的下四层已经有了一个简单的认识与了解&#xff0c;下面让我们对它的最顶层&#xff0c;应用层进行一个简单的学习与认识&#xff0c;由于计算机网络多样的连接形式、不均匀的终端分布&#xff0c;以及网络的开放性和互联性等特征&…

Python流星雨完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

找第三方数据公司获取电商平台商品数据订单数据店铺信息等

API文档 如何获取&#xff1f; 应用业务场景&#xff08;不限&#xff09;

京东tp3手势验证

2024祝我们越来越好。 新年第二天&#xff0c;来看下这最新的tp3手势验证码&#xff0c;很在之前就发过一篇&#xff0c;最近看了看更新了一个东西&#xff0c;但是难点还是在轨迹上面&#xff0c;感兴趣的朋友可以去看看。 risk_jd[jstub] 改了下这&#xff0c;之前我都没带…

基于ThinkPHP的云盘系统Cloudreve本地搭建并实现远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

Flume基础知识(一):Flume组成原理与架构

1. Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 Flume最主要的作用就是&#xff0c;实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS。 2. Fl…

关于标准那些事——第六篇 四象之“白虎”(要素的编写)

两仪生四象——东方青龙&#xff08;木&#xff09;、西方白虎&#xff08;金&#xff09;、南方朱雀&#xff08;火&#xff09;、北方玄武&#xff08;水&#xff09; 分别对应标准编写之四象——层次的编写、要素的编写、要素的表述、格式的编排。 今天来分享一下 要素的编…

【Bug解决】Failed to configure a DataSource

1、问题描述 SpringBoot项目在启动时报出下面的错误&#xff1a; Description: Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider…

大一C语言程序细节复盘2

7-4 学生成绩排序 分数 27 全屏浏览题目 切换布局 作者 张泳 单位 浙大城市学院 假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩&#xff0c;定义一个能够表示学生信息的结构类型。输入n&#xff08;n<50&#xff09;个学生的成绩信息&#xff0c;按照学生…

NFS(文件存储服务)

题目 创建NFS共享文件夹,允许InsideCli可以远程挂载,映射挂载到D卷。共享文件夹路径为D:\shares\NFSshare。共享名称为NFSshare。允许未映射的用户访问。共享权限为读/写。服务配置步骤( 服务端 ) 步骤一 - 安装服务 步骤二 - 配置NFS服务 配置共享文件夹 选择共享路径

WSUS更新服务

题目 安装WSUS更新服务,更新补丁目录设置为“c:\wsusbackup”。创建更新组名称为“CHINASKILLS-WSUS”。每天凌晨03:00下发自动更新。更新服务器地址为“http://wsus.chinaskills.com:8530”。服务配置步骤 步骤一 - 安装Windows Server 更新服务 安装Windows Server 更新服…

外汇天眼:注意!年末大量无监管平台上榜,有的仍在诈骗!

纵观整个10月的天眼客诉排行榜&#xff0c;可以发现此次名单基本上都是无监管的外汇平台&#xff0c;无法出金依旧仍是客诉的关键来源。在本月的客诉榜单中&#xff0c;超过半数的平台仍然在活跃中&#xff0c;交易者们一定要远离&#xff0c;注意警惕。 接下来&#xff0c;就…

一键批量处理,轻松管理TXT文本,自动识别编码,快速转换为ANSI!

在数字化时代&#xff0c;文本文件的管理显得尤为重要。你是否曾经遇到过TXT文本编码格式混乱&#xff0c;导致文件无法正常打开或显示乱码的情况&#xff1f;现在&#xff0c;我们为您带来了一款强大的文本批量处理工具&#xff0c;具备自动识别TXT文本编码并转换为ANSI的功能…

如何使用Docker部署Swagger Editor结合内网穿透实现远程编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

脆弱的SSL加密算法漏洞原理以及修复方法

漏洞名称&#xff1a;弱加密算法、脆弱的加密算法、脆弱的SSL加密算法、openssl的FREAK Attack漏洞 漏洞描述&#xff1a;脆弱的SSL加密算法&#xff0c;是一种常见的漏洞&#xff0c;且至今仍有大量软件支持低强度的加密协议&#xff0c;包括部分版本的openssl。其实&#xf…

RDS快速入门

目录 实例创建 设置白名单 RDS&#xff08;Relational Database Service&#xff09;是一种托管式的关系型数据库服务&#xff0c;它为用户提供了一种简单、可靠、安全的方式来部署、操作和扩展数据库。具有安全可靠、解决运维烦恼、有效降低成本和自研增加等四大特性&#x…

腾讯云服务器CVM和轻量应用服务器优惠价格表2024年更新

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

无监督关键词提取算法:TF-IDF、TextRank、RAKE、YAKE、 keyBERT

TF-IDF TF-IDF是一种经典的基于统计的方法&#xff0c;TF(Term frequency)是指一个单词在一个文档中出现的次数&#xff0c;通常一个单词在一个文档中出现的次数越多说明该词越重要。IDF(Inverse document frequency)是所有文档数比上出现某单词的个数&#xff0c;通常一个单词…

LT8713SX高性能Type-C/DP1.4到Type-C/DP1.4/HDMI2.0转换器,USB3.0高速双向无源开关,支持同屏异显

LT8713SX是一款高性能Type-C/DP1.4到Type-C/DP1.4/HDMI2.0转换器&#xff0c;具有三个可配置的DP1.4/HDMI2.0/ dp输出接口和音频输出接口。LT8713SX支持DisplayPort单流传输(SST)模式和多流传输(MST)模式。当接收到多个视频/音频流&#xff0c;这些视频/音频流被打包并通过单个…

【Java系列】文件操作详解

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …