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

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

相关推荐
2401_841495641 天前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
Hardworking6661 天前
第7章 软硬件系统集成
数据库·软硬件系统集成
名字还没想好☜1 天前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
熊猫钓鱼>_>1 天前
Redis 突发缓存穿透:一次完整的定位复盘
数据库·人工智能·redis·缓存·ai·agent·智能
wenb1n1 天前
MySQL诊断系列(3/6):索引分析——5个SQL揪出“僵尸索引”
数据库·人工智能·编程语言
Ethan01071 天前
redis 热key问题如何解决+场景
redis
段一凡-华北理工大学1 天前
向量数据库实战:选型、调优与落地~系列文章03:向量相似度算法全解:余弦、欧氏、内积,到底该用哪个?
大数据·数据库·人工智能·算法·机器学习·向量相似度·高炉炼铁
ClouGence1 天前
CloudDM 数据库管理平台,全新 UI,更清晰、更高效!
数据库·开源
Devin~Y1 天前
互联网大厂Java面试实战:Spring Boot、MyBatis、Redis、Kafka、JWT、Spring Cloud 与 AI 场景追问
java·spring boot·redis·spring cloud·kafka·mybatis·spring security
花生了什么事o1 天前
DDD:领域驱动设计的初步认识
java·数据库