8 Redis与Lua

LUA脚本语言是C开发的,类似存储过程,是为了实现完整的原子性操作,可以用来补充redis弱事务的缺点.

1、LUA脚本的好处

在这里插入图片描述

2、Lua脚本限流实战

支持分布式
在这里插入图片描述

import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.scripting.support.ResourceScriptSource;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;/*** 分布式限流的服务类*/
@Service
public class IsAcquire {//引入一个Redis的Lua脚本的支持private DefaultRedisScript<Long> getRedisScript;//判断限流方法---类似于RateLimiterpublic boolean acquire(String limitKey,int limit,int expire) throws  Exception{//连接RedisJedis jedis =  new Jedis("127.0.0.1",6379);getRedisScript =new  DefaultRedisScript<>();getRedisScript.setResultType(Long.class);//脚本执行返回值 longgetRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("rateLimiter.lua")));Long result = (Long)jedis.eval(getRedisScript.getScriptAsString(),1,limitKey,String.valueOf(limit),String.valueOf(expire));if(result ==0){return false;}return true;}
}
import com.google.common.util.concurrent.RateLimiter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** 类说明:接口类,抢购接口* http请求控制类  Contoller*/
@RestController
public class Controller {@AutowiredIsAcquire isAcquire;//手下的分布式限流//final  RateLimiter rateLimiter = RateLimiter.create(5);  //guava引入的令牌桶限流(非分布式,单机)//秒杀接口@RequestMapping("/order")public String killProduct(@RequestParam(required = true) String name) throws Exception{//rateLimiter.tryAcquire(1); //调用if(isAcquire.acquire("iphone",10,60)){//60秒只能进行10次System.out.println("业务成功!");return "恭喜("+name+"),抢到iphone!";}else{System.out.println("-----------业务被限流");return "对不起,你被限流了!";}}
}

rateLimiter.lua脚本如下:

--java端送入三个参数(1个key,2个param  )string
--limitKey(redi中key的值)
local key =KEYS[1];
--limit(次数)
local times = ARGV[1];
--expire(S)
local expire = ARGV[2];
--对key-value中的 value +1的操作  返回一个结果local afterval=  redis.call('incr',key);
if afterval ==1 then --第一次redis.call('expire',key,tonumber(expire) )  --失效时间(1S)  TLL 1Sreturn 1; --第一次不会进行限制
end
--不是第一次,进行判断
if afterval > tonumber(times) then--限制了return 0;
endreturn 1;

以上简单的计数器的方式,就是一种固定窗口的算法,可以实现对单个接口的限流.

3、限流算法

在这里插入图片描述

固定窗口算法的问题

在这里插入图片描述
解决方案:改为滑动窗口,避免固定窗口的临界问题
滑动窗口演示地址:

https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/selective-repeat-protocol/index.html
漏桶算法

在这里插入图片描述
在这里插入图片描述
漏桶,令牌的算法的缺点就是时间复杂度:O(N),不适用于大并发的请求
滑动窗口的缺点是需要双方先定好协议

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

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

相关文章

Map 和 WeakMap:JavaScript 中的键值对集合

JavaScript 是一种动态、弱类型的脚本语言&#xff0c;经常用于构建现代 Web 应用程序。在编写 JavaScript 代码时&#xff0c;我们经常需要使用各种数据结构来存储和管理数据。其中&#xff0c;Map 和 WeakMap 就是两个非常有用的数据结构&#xff0c;它们分别提供了用于存储键…

Excel 文件比较工具 xlCompare 11.01 Crack

比较两个 Excel 文件之间的差异 xlCompare. xlCompare.com 是性能最佳的 Excel diff 工具&#xff0c;用于比较两个 Excel 文件或工作表并在线突出显示差异。xlCompare 包括免费的在线 Excel 和 CSV 文件比较服务以及用于比较和合并 Excel 文件的强大桌面工具。如果您想在线了…

软件测试: 测试用例

一. 软件测试四要素 测试环境,操作步骤,测试数据,预期结果 二. 基于需求进行测试用例的设计 基于需求设计测试用例是测试设计和开发测试用例的基础,第一步就要分析测试需求,验证需求是否正确,完整,无二义性,并且逻辑自洽.在需求正确的基础上细化测试需求,从测试需求提炼出一…

Java语言基础第三天

运算符&#xff1a; 算术&#xff1a;、-、*、/、%、、-- %:取模/取余&#xff0c;余数为0即为整除 System.out.println(5%2); //1&#xff0c;商2余1 System.out.println(8%2); //0&#xff0c;商4余0----整除 System.out.println(2%8); //2&#xff0c;商0余2 /--:自增1/自…

React整理总结(五、Redux)

1.Redux核心概念 纯函数 确定的输入&#xff0c;一定会产生确定的输出&#xff1b;函数在执行过程中&#xff0c;不能产生副作用 store 存储数据 action 更改数据 reducer 连接store和action的纯函数 将传入的state和action结合&#xff0c;生成一个新的state dispatc…

2023年亚太杯数学建模亚太赛A题思路解析+代码+论文

下文包含&#xff1a;2023年亚太杯数学建模亚太赛A题思路解析代码参考论文等及如何准备数学建模竞赛&#xff08;23号比赛开始后逐步更新&#xff09; C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料&#xff0c;帮助大家取得好成…

猫12分类:使用yolov5训练检测模型

前言&#xff1a; 在使用yolov5之前&#xff0c;尝试过到百度飞桨平台&#xff08;小白不建议&#xff09;、AutoDL平台&#xff08;这个比较友好&#xff0c;经济实惠&#xff09;训练模型。但还是没有本地训练模型来的舒服。因此远程了一台学校电脑来搭建自己的检测模型。配置…

hdfsClient_java对hdfs进行上传、下载、删除、移动、打印文件信息尚硅谷大海哥

Java可以通过Hadoop提供的HDFS Java API来控制HDFS。通过HDFS Java API&#xff0c;可以实现对HDFS的文件操作&#xff0c;包括文件的创建、读取、写入、删除等操作。 具体来说&#xff0c;Java可以通过HDFS Java API来创建一个HDFS文件系统对象&#xff0c;然后使用该对象来进…

Django DRF权限组件

在Django的drf框架内的权限组件&#xff0c;如果遇到多个权限认证类&#xff0c;是需要所有的权限类都要通过验证&#xff0c;才能访问视图。 一、简单示例 1、per.py 自定义权限类 from rest_framework.permissions import BasePermission import randomclass MyPerssion(B…

傅里叶级数公式及其收敛问题

文章目录 abstract函数展开成傅里叶系数傅里叶系数求解 a 0 a_0 a0​求解 a n a_n an​求解 b n b_n bn​小结 傅里叶级数&#x1f388;周期为 2 π 2\pi 2π的函数的fourier级数展开公式小结三角级数收敛问题Dirichlet收敛定理例 abstract 傅里叶级数公式及其收敛问题介绍周期…

自动化运维中间件架构概况

自动化运维中间件架构概况 kubernetesjenkins 安装k8s后 设置 Jenkins 任务: 在 Jenkins 中创建一个新的任务&#xff1a; 配置源代码管理&#xff1a;选择 Git&#xff0c;并提供 GitLab 仓库的 URL、凭据和分支信息。配置构建步骤&#xff1a;选择 Maven 构建&#xff0c;…

集合的自反关系和对称关系

集合的自反关系和对称关系 一&#xff1a;集合的自反关系1&#xff1a;原理&#xff1a;2&#xff1a;代码实现 二&#xff1a;对称关系1&#xff1a;原理&#xff1a;2&#xff1a;代码实现 三&#xff1a;总结 一&#xff1a;集合的自反关系 1&#xff1a;原理&#xff1a; …

【python】直方图正则化详解和示例

直方图正则化&#xff08;Histogram Normalization&#xff09;是一种图像增强技术&#xff0c;目的是改变图像的直方图以改善图像的质量。具体来说&#xff0c;它通过将图像的直方图调整为指定的形状&#xff0c;以增强图像的对比度和亮度。 直方图正则化的基本步骤如下&…

【Android Jetpack】Hilt的理解与浅析

文章目录 依赖注入DaggerHiltKoin添加依赖项Hilt常用注解的含义HiltAndroidAppAndroidEntryPointInjectModuleInstallInProvidesEntryPoint Hilt组件生命周期和作用域如何使用 Hilt 进行依赖注入 本文只是进行了简单入门&#xff0c;博客仅当做笔记用。 依赖注入 依赖注入是一…

某60区块链安全之不安全的随机数实战二学习记录

区块链安全 文章目录 区块链安全不安全的随机数实战二实验目的实验环境实验工具实验原理实验内容EXP利用 不安全的随机数实战二 实验目的 学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工具 python3 实验原理 由…

吴恩达《机器学习》9-1:代价函数

一、引入新标记方法 首先&#xff0c;引入一些新的标记方法&#xff0c;以便更好地讨论神经网络的代价函数。考虑神经网络的训练样本&#xff0c;其中每个样本包含输入 x 和输出信号 y。我们用 L 表示神经网络的层数&#xff0c;表示每层的神经元个数&#xff08;表示输出层神…

CISP练习测试题

免责声明 文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 某公司准备在业务环境中部署一种新的计算机产品,下列哪一项…

基于单片机GPS轨迹定位和里程统计系统

**单片机设计介绍&#xff0c; 基于单片机GPS轨迹定位和里程统计系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 一个基于单片机、GPS和里程计的轨迹定位和里程统计系统可以被设计成能够在移动的交通工具中精确定位车辆的位置…

Spring Boot - 自定义注解来记录访问路径以及访问信息,并将记录存储到MySQL

1、准备阶段 application.properties&#xff1b;yml 可通过yaml<互转>properties spring.datasource.urljdbc:mysql://localhost:3306/study_annotate spring.datasource.usernameroot spring.datasource.password123321 spring.datasource.driver-class-namecom.mysq…

论x巴克app签名的逆向分析过程《完整篇》

app地址—> 点击直达 密码&#xff1a;2fkq工具 jadx-gui 自己下载待定