redis分布式锁
package main
import (
"fmt"
"log"
"sync"
"time"
"github.com/go-redis/redis"
)
// 声明一个全局的rdb变量
var rdb *redis.Client
var mutex sync.Mutex
// 初始化连接
func initClient() (err error) {
rdb = redis.NewClient(&redis.Options{
Addr: "ip:port",
Password: "",
DB: 7,
})
_, err = rdb.Ping().Result()
if err != nil {
return err
}
return nil
}
// 加锁
func Lock(key string) bool {
// ex:设置默认过期时间10秒,防止死锁
ex:=10*time.Second
mutex.Lock()
defer mutex.Unlock()
bool,err := rdb.SetNX(key, `{"lock":1}`, ex).Result()
if err != nil {
return bool
}
return bool
}
// 解锁
func UnLock(key string) int64 {
nums, err := rdb.Del(key).Result()
if err != nil {
log.Println(err.Error())
return 0
}
return nums
}
func main() {
err := initClient()
if err != nil {
fmt.Println(err)
}
b := Lock("lock")
if b == true{
// 抢锁成功
执行自己的逻辑
nums:=UnLock("lock")
if nums == 1{
// 释放锁成功
}
}else {
// 抢锁失败
}
}
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/244968.html