go-redlock

Redis-backed distributed leases for Go

go get github.com/ndyakov/go-redlock

manager, _ := redlock.NewSingle(rdb, redlock.Config{
    Expiry:   10 * time.Second,
    Attempts: 3,
})

lock := manager.NewLock("orders:{42}:lock",
    redlock.WithAutoRenew(3*time.Second),
    redlock.WithFencingToken("orders:{42}:fence"),
)

if err := lock.TryLock(ctx); err != nil { return err }
defer lock.Unlock(context.Background())

fence := lock.FencingToken() // monotonic; pass to your writes