Redis中的Lua使用

Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大,所以许多应用都选用它作为脚本语言,尤其是在游戏领域,暴雪公司的"魔兽世界","愤怒的小鸟",Nginx将Lua语言作为扩展。Redis将Lua作为脚本语言可帮助开发者定制自己的Redis命令。

Redis 2.6 版本通过内嵌支持 Lua 环境。也就是说一般的运用,是不需要单独安装Lua的。

一.为什么使用Lua

1、减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行;

2、原子操作,Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件;

3、复用性,客户端发送的脚本会存储在Redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑

二.怎么使用

java 复制代码
eval script numkeys key [key ...] arg [arg ...]

1、script 参数:

是一段 Lua 脚本程序,它会被运行在Redis 服务器上下文中,这段脚本不必(也不应该)定义为一个 Lua 函数。

2、numkeys 参数:

用于指定键名参数的个数。

3、key key... 参数:

从 eval 的第三个参数开始算起,使用了 numkeys 个键(key),表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用1为基址的形式访问(KEYS1,KEYS2···)。

4、arg arg...参数:

可以在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似(ARGV1,ARGV2···)。

java 复制代码
eval "return redis.call('mset',KEYS[1],ARGV[1],KEYS[2],ARGV[2])" 2 goudan wangcai 111 222

三. Redis与限流

1、使用Redis+Lua语言实现限流

2、限流算法

3-2-1 固定窗口算法

简单粗暴,但是有临界问题

3-2-2、滑动窗口算法
算法演示

不会出现边界问题,但是主要缺陷是内存占用较高,因为需要存储每个请求的时间戳,当限流阈值大或请求频繁时,zset会积累大量元素。另外,ZREMRANGEBYSCORE和ZCARD操作的时间复杂度是O(logN),高并发下可能对Redis性能有一定影响。

3-2-3、漏洞算法

漏桶核心是:请求来了以后,直接进桶,然后桶根据自己的漏洞大小慢慢往外面漏。但是处理突发情况下处理差

3-2-4、令牌算法

突发情况下可以一次拿多个令牌进行处理。

相关推荐
freejackman7 分钟前
【架构篇】双遍历 + 多栈协同:手撸 SQL 血缘引擎的架构思考
java·大数据·数据库·hive·sql·架构·spark
杨云龙UP9 分钟前
TDengine 社区版磁盘空间不足故障处理 SOP:历史日志清理、日志保留策略及数据保留 200 天
数据库·时序数据库·tdengine·tsdb·历史日志清理·trim database·logkeepdays
betazhou19 分钟前
MySQL Oracle官方备份工具
数据库·mysql·oracle
一万年太久。36 分钟前
mysql主从复制
数据库·mysql
车载中间件通信1 小时前
[TC8测试]TCP_FLAGS_PROCESSING_06
数据库·网络协议·tcp/ip·中间件·tc8
呆萌很1 小时前
达梦数据库(DM)和MySQL核心区别
数据库
l1t1 小时前
DeepSeek总结的pgrust以光速编程:构建 Gravity 查询引擎
数据库·人工智能·postgresql
木木_Q4057733491 小时前
Oracle 增量同步配置指南:只搬变了的数据,不重复也不漏数
数据库·oracle·数据同步·数据库同步·增量同步
努力努力再努力wz1 小时前
【Lua 入门系列】从执行模型到事件驱动:一文理解 Lua 有栈协程、挂起恢复与协作式调度
开发语言·lua
升鲜宝供应链及收银系统源代码服务2 小时前
Java Spring Boot 商业版 升鲜宝供应链管理系统--商品模块表与字段分析(商品管理页面业务逻辑与数据表关系分析)
数据库·生鲜配送系统排名·生鲜配送系统架构设计·b2b订货商城解决方案·生鲜配送系统源代码出售·生鲜配送系统设计源代码