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、令牌算法

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

相关推荐
KIDULT°1 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
我不是程序员三三1 小时前
透明加密软件偶发解密异常排错实录:文件时能打开时乱码
数据库·域智盾
snhna1 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
天行健,君子而铎2 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
牛战士coding2 小时前
MySQL 读写分离完整链路:主从复制、多数据源与 @DS 路由
数据库·mysql
goehou3 小时前
MCP 查数实战:让 LLM 安全地查数据库(只读账号、SQL 校验、参数漂移)
数据库·ai·llm·教程·mcp·function calling
我不会插花弄玉3 小时前
7.函数【由浅入深-MySQL】
android·数据库·mysql
周小董3 小时前
[1369]Windows上安装PostgreSQL
数据库·windows·postgresql
一只积极向上的小咸鱼6 小时前
第一性原理思考:从拆解问题到用实验检验答案
数据库
这个DBA有点耶6 小时前
时序数据库InfluxDB高基数问题深度拆解:内存索引膨胀机制与OOM完整链路
数据库·架构·dba