go分布式锁-lua脚本快速入门

注释

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.giticon-default.png?t=O83Ahttps://gitee.com/alsark/go-lua.git

下面是一个使用Lua脚本实现Redis分布式锁的代码示例: ```lua -- Lua脚本实现Redis分布式锁 local lockKey = 'lock' local uuid = ARGV\[1\] if redis.call('get', lockKey) == uuid then redis.call('del', lockKey) return 1 else return 0 end ``` 这段代码首先定义了一个锁的键名为`lockKey`,然后通过传入的参数`ARGV\[1\]`获取到要删除的锁的UUID。接下来,它会通过`redis.call('get', lockKey)`来获取当前锁的值,如果与传入的UUID相等,则说明当前锁是由该UUID持有的,此时会使用`redis.call('del', lockKey)`来删除锁,并返回1表示删除成功。如果锁的值与传入的UUID不相等,则说明当前锁不是由该UUID持有的,此时直接返回0表示删除失败。 这段代码可以用于实现Redis分布式锁的原子性删除操作,确保只有持有锁的客户端才能删除锁,避免误删锁的问题。同时,使用Lua脚本可以保证删除锁的操作是原子性的,避免并发情况下的竞争问题。 #### 引用[.reference_title] - *1* *2* [Redis 实现分布式锁+执行lua脚本](https://blog.youkuaiyun.com/qq_34285557/article/details/129700808)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Redis的分布式锁问题(九)Redis + Lua 脚本实现分布式锁](https://blog.youkuaiyun.com/weixin_43715214/article/details/127982757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值