zoukankan      html  css  js  c++  java
  • (八)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
    ", 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()
    }
    
    
  • 相关阅读:
    mktemp -t -d用法
    使用getopts处理输入参数
    linux中$1的意思
    linux中的set -e 与set -o pipefail
    在windows 7 和linux上安装xlwt和xlrd
    nginx map使用方法
    Linux crontab下关于使用date命令和sudo命令的坑
    东哥讲义
    ldapsearch使用
    date 命令之日期和秒数转换
  • 原文地址:https://www.cnblogs.com/walkinginthesun/p/10600476.html
Copyright © 2011-2022 走看看