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
	}

}

  

猜你喜欢

转载自www.cnblogs.com/flycc/p/12678134.html
今日推荐