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
	}

}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM