注释
local a = 1 -- 我是注释
变量
local a = 1 -- 定义变量
a = 2 -- 对变量重新赋值
print(a) --打印
if语句
if 2 > 1 then
print("2大于1")
end
if 2 > 1 then
print("2大于1")
else
print("2小于等于1")
end
注意
Lua中 0 为 true
if 0 then
print("Lua中 0 为 true")
end
运算符
注意
不等于是 ~=
redis执行lua脚本示例
var sumsc = redis.NewScript(`
--Lua 脚本
local key = KEYS[1]
local value = ARGV[1]
local va1 = ARGV[2]
local va2 = ARGV[3]
redis.call("SET", key, value)
res = va1 + va2
return res
`)
sum, err := sumsc.Run(ctx, rdb, []string{"my_sum"}, "1", 2, 3).Int()
fmt.Println(sum, err)
最简的分布式锁示例
package main
import (
"fmt"
"godb/config"
"github.com/gin-gonic/gin"
"github.com/redis/go-redis/v9"
)
func main() {
r := gin.New()
//抢锁
r.GET("/setnx", func(c *gin.Context) {
var incrBy = redis.NewScript(`
--Lua 脚本
local key = KEYS[1] -- 获取第一个键参数
local value = ARGV[1] -- 获取第一个值参数
local ttl = ARGV[2] -- 获取第二个值参数
local result = redis.call("SETNX", key, value) -- 使用 redis.call 来执行 SETNX 命令
if result == 1 then
redis.call("EXPIRE", key, ttl)
end
return result -- 返回结果
`)
result, err := incrBy.Run(config.Ctx, config.Rdb, []string{"key"}, "hhhhggfhfffghdftdgtdtgdt", 60).Int()
if err != nil {
fmt.Println("Error:", err)
} else {
if result == 0 {
fmt.Println("抢锁失败")
}
if result == 1 {
fmt.Println("抢锁成功")
}
}
})
//解锁
r.GET("/del", func(c *gin.Context) {
var incrBy = redis.NewScript(`
--Lua 脚本
local key = KEYS[1] -- 获取第一个键参数
local result = redis.call("DEL", key) -- 删除锁
return result -- 返回结果
`)
result, err := incrBy.Run(config.Ctx, config.Rdb, []string{"key"}).Int()
if err != nil {
fmt.Println("Error:", err)
}
if result == 1 {
fmt.Println("删锁成功")
}
})
r.Run()
}
完整代码
https://gitee.com/alsark/go-lua.githttps://gitee.com/alsark/go-lua.git