go-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 {
                // 抢锁失败
        }
}