Lua脚本在Redis中的应用

Lua脚本在Redis中的应用
penjcLua 语言详解
Lua 是一种轻量级的脚本语言,常用于嵌入式开发,如游戏开发、数据库(如 Redis)、Nginx 以及嵌入式系统。它具有简洁的语法、快速执行速度和较低的资源消耗。
1. Lua 语言基础
(1)变量
Lua 是动态类型语言,变量的类型在运行时确定。
1 | -- 变量赋值 |
(2)数据类型
Lua 主要有以下几种数据类型:
nil
:空值boolean
:布尔类型(true
/false
)number
:数值类型(整数和浮点数)string
:字符串table
:表(类似于 Python 的字典)function
:函数
1 | local a = nil |
(3)运算符
1 | -- 算术运算 |
(4)控制结构
条件判断
1 | local age = 18 |
循环
1 | -- for 循环 |
(5)函数
1 | function add(a, b) |
(6)Table(类似字典/数组)
1 | local t = { name = "Alice", age = 25 } |
Lua 在 Redis 中的应用
Redis 允许用户在服务器端执行 Lua 脚本,这样可以实现高效的事务和批处理操作。Redis 使用 EVAL
命令执行 Lua 脚本,使得多个命令在一个事务中完成,避免网络往返和数据竞争。
1. 在 Redis 中使用 Lua
(1)基本执行
1 | EVAL "return 'Hello, Redis!'" 0 |
EVAL
运行 Lua 脚本"return 'Hello, Redis!'"
代表返回一个字符串0
表示不需要使用 Redis 键
(2)读取 Redis 键
1 | EVAL "return redis.call('GET', KEYS[1])" 1 mykey |
redis.call('GET', KEYS[1])
相当于GET mykey
1 mykey
代表传入一个键mykey
(3)写入 Redis
1 | EVAL "redis.call('SET', KEYS[1], ARGV[1])" 1 mykey "hello" |
redis.call('SET', KEYS[1], ARGV[1])
相当于SET mykey hello
ARGV[1]
代表传入的参数"hello"
2. Redis Lua 事务
Lua 在 Redis 中 是原子执行的,这意味着整个脚本会在执行时被锁定,直到完成执行后才会释放。
(1)Redis 计数器
1 | EVAL "return redis.call('INCR', KEYS[1])" 1 counter |
INCR
命令对counter
键进行自增。
(2)Redis 分布式锁
获取锁
1 | EVAL "return redis.call('SET', KEYS[1], ARGV[1], 'NX', 'EX', ARGV[2])" 1 mylock "token123" 30 |
SET mylock "token123" NX EX 30
,表示:NX
:如果mylock
不存在才设置EX
:设置过期时间 30 秒
释放锁
1 | EVAL " |
- 先检查
mylock
是否是"token123"
,如果是则删除锁,否则返回0
。
3. 限流(Rate Limiting)
实现 API 访问限流,每个用户每分钟最多请求 10 次
1 | EVAL " |
INCR
递增请求次数EXPIRE
设置 60 秒过期ARGV[2] = 10
表示每分钟最多允许 10 次请求- 如果超过 10 次,返回
0
,否则返回1
4. Redis Lua 实现转账
用户 A 给用户 B 转账
1 | EVAL " |
- 检查
userA
余额是否足够 - 如果足够,扣除
100
,然后给userB
增加100
总结
- Lua 语法简单,包括变量、控制结构、函数、表等基本功能。
- Redis Lua 脚本 通过
EVAL
执行,并支持redis.call()
来调用 Redis 命令。 - Redis Lua 原子性 确保整个脚本执行过程中数据不会被并发修改。
- Redis Lua 应用场景:
- 计数器(如用户访问计数)
- 限流(限制 API 访问频率)
- 分布式锁(保证数据一致性)
- 转账系统(事务性操作)
评论
匿名评论
✅ 你无需删除空行,直接评论以获取最佳展示效果