大佬们问个问题,redsync锁为什么执行到第二个goroutine就会报错呢?
panic: redsync: failed to acquire lock
package main
import (
"fmt"
"sync"
"time"
goredislib "github.com/go-redis/redis/v8"
"github.com/go-redsync/redsync/v4"
"github.com/go-redsync/redsync/v4/redis/goredis/v8"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go RedisLock(&wg)
}
wg.Wait()
}
func RedisLock(wg *sync.WaitGroup) {
defer wg.Done()
redisAddr := "192.168.31.51:6379"
client := goredislib.NewClient(&goredislib.Options{
Addr: redisAddr,
Password: "123456",
})
pool := goredis.NewPool(client)
rs := redsync.New(pool)
mutexname := "product@1"
mutex := rs.NewMutex(mutexname)
fmt.Println("Start Lock...")
err := mutex.Lock()
if err != nil {
panic(err)
}
fmt.Println("Get Lock!")
time.Sleep(time.Second * 3)
fmt.Println("Unlock!")
ok, err := mutex.Unlock()
if !ok {
panic("Unlock Failed!")
}
if err != nil {
panic(err)
}
fmt.Println("Release Lock!")
}
问题:
Start Lock...
Start Lock...
Start Lock...
Get Lock!
Unlock!
Release Lock!
Get Lock!
panic: redsync: failed to acquire lock
goroutine 20 [running]:
main.RedisLock(0x0)
/Users/ma/go/study/micro/8/test/main.go:35 +0x2b0
Go版本:1.17.3
redsync 的分布式锁不是无限等待,重试几次之后就会直接失败。
你这个应该是第三个 goroutine 等太久拿不到锁,失败了。
ErrFailed