Go redis 分布式锁

redis分布式锁:可以使用setnx+expire+pipeline:

//方法一:setnx+expire+pipeline

func DoSetWithPipe(conn redis.Conn){
        lock.Lock()
        defer lock.Unlock()

        conn.Send("setnx","dirlock","true")
        conn.Send("expire","dirlock",10)
        err := conn.Flush()
        if err != nil{
                fmt.Println("redis Flush err=",err)
                return
        }
        res,err := conn.Receive()
        if err != nil{
                fmt.Println("redis Receive err=",err)
                return
        }
        if res.(int64) != 1{
                fmt.Printf("redis pipeline failed, res=%v,%T\n",res,res)
                return
        }
        //处理业务
        conn.Do("set","name","fly")
        //...

        //释放锁
        res,err = conn.Do("del","dirlock")
        if err != nil{
                fmt.Println("redis del lock failed, err=",err)
                return
        }
        if res.(int64) != 1{
                fmt.Printf("redis del lock failed, res=%v,%T\n",res, res)
                return
        }

}

  方法二:使用set参数,一步搞定:

//使用set 参数实现分布式锁
func DoSet(conn redis.Conn,commandName string, args... interface{}){
        lock.Lock()
        defer lock.Unlock()
        res,err := conn.Do("set","dirlock","true","EX",10,"NX")
        if err != nil{
                fmt.Println("redis get lock failed,err=",err)
                return
        }
        if res != "OK"{
                fmt.Println("redis get lock failed, res=",res)
                return
        }
        //处理业务
        conn.Do("set","name","fly")
        //...

        //释放锁
        res,err = conn.Do("del","dirlock")
        if err != nil{
                fmt.Println("redis del lock failed, err=",err)
                return
        }
        if res.(int64) != 1{
                fmt.Printf("redis del lock failed, res=%v,%T\n",res, res)
                return
        }

}