(八)setnx实现分布式锁

distribute_lock.go

package lock

import (
    "errors"
    "fmt"
    "github.com/gomodule/redigo/redis"
)

type DistributeLock struct {
    Key   string
    Value string

    RedisAddress string
}

func NewDistributeLock(key string, value string, redisAddress string) *DistributeLock {
    return &DistributeLock{Key: key, Value: value, RedisAddress: redisAddress}
}

func (dl *DistributeLock) Lock() error {
    c, err := redis.Dial("tcp", dl.RedisAddress)
    if err != nil {
        return err
    }
    defer c.Close()

    res, err := redis.Int(c.Do("setnx", dl.Key, dl.Value))
    if err != nil {
        return err
    }
    if res != 1 {
        return errors.New("lock failed")
    }
    return nil
}

func (dl *DistributeLock) UnLock() error {
    c, err := redis.Dial("tcp", dl.RedisAddress)
    if err != nil {
        return err
    }
    defer c.Close()

    res, err := redis.Int(c.Do("del", dl.Key))
    if err != nil {
        return err
    }
    if res != 1 {
        return errors.New("unlock failed")
    }
    return nil
}

func (dl *DistributeLock) GetLock() error {
    c, err := redis.Dial("tcp", dl.RedisAddress)
    if err != nil {
        return err
    }
    defer c.Close()

    result, err := redis.String(c.Do("GET", dl.Key))
    if err != nil {
        return err
    }
    fmt.Printf("key: %v, value: %v\n", dl.Key, result)
    return nil
}

disribute_lock_test.go

package lock

import (
    "fmt"
    "testing"
)

func TestDistributeLock_Lock(t *testing.T) {
    dl := NewDistributeLock("lock.bluetool", "uuid", "10.1.64.80:6379")
    err := dl.Lock()
    if err != nil {
        fmt.Printf("lock failed")
        return
    }
    defer dl.UnLock()

    // do something
    dl.GetLock()
}

转载于:https://www.cnblogs.com/walkinginthesun/p/10600476.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值