github.com/go-redsync/redsync/v4
import "github.com/go-redsync/redsync/v4"
Package redsync provides a Redis-based distributed mutual exclusion lock implementation as described in the post http://redis.io/topics/distlock.
Values containing the types defined in this package should not be copied.
Variables
ErrExtendFailed is the error resulting if Redsync fails to extend the lock.
var ErrExtendFailed = errors.New("redsync: failed to extend lock")ErrFailed is the error resulting if Redsync fails to acquire the lock after exhausting all retries.
var ErrFailed = errors.New("redsync: failed to acquire lock")ErrLockAlreadyExpired is the error resulting if trying to unlock the lock which already expired.
var ErrLockAlreadyExpired = errors.New("redsync: failed to unlock, lock was already expired")Functions
func New(pools ...redis.Pool) *Redsync
New creates and returns a new Redsync instance from given Redis connection pools.
func WithDriftFactor(factor float64) Option
WithDriftFactor can be used to set the clock drift factor. The default value is 0.01.
func WithExpiry(expiry time.Duration) Option
WithExpiry can be used to set the expiry of a mutex to the given value. The default is 8s.
func WithFailFast(b bool) Option
WithFailFast can be used to quickly acquire and release the lock. When some Redis servers are blocking, we do not need to wait for responses from all the Redis servers response. As long as the quorum is met, we can assume the lock is acquired. The effect of this parameter is to achieve low latency, avoid Redis blocking causing Lock/Unlock to not return for a long time.
func WithGenValueFunc(genValueFunc func() (string, error)) Option
WithGenValueFunc can be used to set the custom value generator.
func WithRetryDelay(delay time.Duration) Option
WithRetryDelay can be used to set the amount of time to wait between retries. The default value is rand(50ms, 250ms).
func WithRetryDelayFunc(delayFunc DelayFunc) Option
WithRetryDelayFunc can be used to override default delay behavior.
func WithSetNXOnExtend() Option
WithSetNXOnExtend improves extending logic to extend the key if exist and if not, tries to set a new key in redis Useful if your redises restart often and you want to reduce the chances of losing the lock Read this MR for more info: https://github.com/go-redsync/redsync/pull/149
func WithShufflePools(b bool) Option
WithShufflePools can be used to shuffle Redis pools to reduce centralized access in concurrent scenarios.
func WithTimeoutFactor(factor float64) Option
WithTimeoutFactor can be used to set the timeout factor. The default value is 0.05.
func WithTries(tries int) Option
WithTries can be used to set the number of times lock acquire is attempted. The default value is 32.
func WithValue(v string) Option
WithValue can be used to assign the random value without having to call lock. This allows the ownership of a lock to be "transferred" and allows the lock to be unlocked from elsewhere.
Types
type DelayFunc
A DelayFunc is used to decide the amount of time to wait between retries.
type DelayFunc func(tries int) time.Durationtype ErrNodeTaken
ErrNodeTaken is the error resulting if the lock is already taken in one of the cluster's nodes
type ErrNodeTaken struct {
Node int
}Fields
Node int
func Error() string
type ErrTaken
ErrTaken happens when the lock is already taken in a quorum on nodes.
type ErrTaken struct {
Nodes []int
}Fields
Nodes []int
func Error() string
type Mutex
A Mutex is a distributed mutual exclusion lock.
type Mutex struct {
// contains filtered or unexported fields
}func Extend() (bool, error)
Extend resets the mutex's expiry and returns the status of expiry extension.
func ExtendContext(ctx context.Context) (bool, error)
ExtendContext resets the mutex's expiry and returns the status of expiry extension.
func Lock() error
Lock locks m. In case it returns an error on failure, you may retry to acquire the lock by calling this method again.
func LockContext(ctx context.Context) error
LockContext locks m. In case it returns an error on failure, you may retry to acquire the lock by calling this method again.
func Name() string
Name returns mutex name (i.e. the Redis key).
func TryLock() error
TryLock only attempts to lock m once and returns immediately regardless of success or failure without retrying.
func TryLockContext(ctx context.Context) error
TryLockContext only attempts to lock m once and returns immediately regardless of success or failure without retrying.
func Unlock() (bool, error)
Unlock unlocks m and returns the status of unlock.
func UnlockContext(ctx context.Context) (bool, error)
UnlockContext unlocks m and returns the status of unlock.
func Until() time.Time
Until returns the time of validity of acquired lock. The value will be zero value until a lock is acquired.
func Valid() (bool, error)
Valid returns true if the lock acquired through m is still valid. It may also return true erroneously if quorum is achieved during the call and at least one node then takes long enough to respond for the lock to expire.
Deprecated: Use Until instead. See https://github.com/go-redsync/redsync/issues/72.
func ValidContext(ctx context.Context) (bool, error)
ValidContext returns true if the lock acquired through m is still valid. It may also return true erroneously if quorum is achieved during the call and at least one node then takes long enough to respond for the lock to expire.
Deprecated: Use Until instead. See https://github.com/go-redsync/redsync/issues/72.
func Value() string
Value returns the current random value. The value will be empty until a lock is acquired (or WithValue option is used).
type Option
An Option configures a mutex.
type Option interface {
Apply(*Mutex)
}Methods
Apply func(*Mutex)
type OptionFunc
OptionFunc is a function that configures a mutex.
type OptionFunc func(*Mutex)func Apply(mutex *Mutex)
Apply calls f(mutex)
type RedisError
A RedisError is an error communicating with one of the Redis nodes.
type RedisError struct {
Node int
Err error
}Fields
Node intErr error
func Error) Error() string
func Unwrap() error
type Redsync
Redsync provides a simple method for creating distributed mutexes using multiple Redis connection pools.
type Redsync struct {
// contains filtered or unexported fields
}func NewMutex(name string, options ...Option) *Mutex
NewMutex returns a new distributed mutex with given name.
