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