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 } }