本文主要记录一下ts如何使用redis的lua的脚本。这样的话 我们就可以实现一些原子性操作了。
下面介绍的是setnex
第一步:创建lua文件
.lua文件
-- local为局部变量,没有local关键字,则视为全局变量
-- redis.call是调用redis命令
-- ARGV[1]为第1个参数,lua数组下标从1开始
local key = ARGV[1]
local expiry = ARGV[2]
local value = ARGV[3]
local reply = redis.call("SETNX", key, value)
if 1 == reply then
redis.call("EXPIRE", key, expiry)
end
return reply
第二步:
需要加在lua文件,这里我们使用fs来加载文件流。
ps:这里的redis的连接使用的ioredis插件进行的链接。
import { promises as fs } from "fs";//这里需要node12以上的版本
let luaScript: any;
const setNexPath = path.join(__dirname, "../utils/setnex.lua");
async function setNex(key: string, val: string, expTime: number) {
if(!luaScript) {
luaScript = await fs.readFile(setNexPath);
}
return await redis.eval(luaScript, 0, key, expTime, val);
}