Documentation ¶
Overview ¶
Example ¶
// Connect to Redis client := redis.NewClient(&redis.Options{ Network: "tcp", Addr: "127.0.0.1:6379", }) defer client.Close() // Create a new locker with default settings locker := lock.New(client, "lock.foo", nil) // Try to obtain lock hasLock, err := locker.Lock() if err != nil { panic(err.Error()) } else if !hasLock { fmt.Println("could not obtain lock!") return } // Don't forget to defer Unlock! defer locker.Unlock() fmt.Println("I have a lock!") // Sleep and check if still locked afterwards. time.Sleep(200 * time.Millisecond) if locker.IsLocked() { fmt.Println("My lock has expired!") } // Renew your lock renewed, err := locker.Lock() if err != nil { panic(err.Error()) } else if !renewed { fmt.Println("could not renew lock!") return } fmt.Println("I have renewed my lock!")
Output: I have a lock! My lock has expired! I have renewed my lock!
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var ( ErrLockUnlockFailed = errors.New("lock unlock failed") ErrLockNotObtained = errors.New("lock not obtained") ErrLockDurationExceeded = errors.New("lock duration exceeded") )
ErrLockNotObtained may be returned by Obtain() and Run() if a lock could not be obtained.
Functions ¶
Types ¶
type Locker ¶
type Locker struct {
// contains filtered or unexported fields
}
Locker allows (repeated) distributed locking.
func New ¶
func New(client RedisClient, key string, opts *Options) *Locker
New creates a new distributed locker on a given key.
func Obtain ¶
func Obtain(client RedisClient, key string, opts *Options) (*Locker, error)
Obtain is a shortcut for New().Lock(). It may return ErrLockNotObtained if a lock was not successfully acquired.
func (*Locker) Lock ¶
Lock applies the lock, don't forget to defer the Unlock() function to release the lock after usage.
func (*Locker) LockWithContext ¶
LockWithContext is like Lock but allows to pass an additional context which allows cancelling lock attempts prematurely.
type Options ¶
type Options struct { // The maximum duration to lock a key for // Default: 5s LockTimeout time.Duration // The number of time the acquisition of a lock will be retried. // Default: 0 = do not retry RetryCount int // RetryDelay is the amount of time to wait between retries. // Default: 100ms RetryDelay time.Duration }
Options describe the options for the lock
type RedisClient ¶
type RedisClient interface { SetNX(key string, value interface{}, expiration time.Duration) *redis.BoolCmd Eval(script string, keys []string, args ...interface{}) *redis.Cmd EvalSha(sha1 string, keys []string, args ...interface{}) *redis.Cmd ScriptExists(scripts ...string) *redis.BoolSliceCmd ScriptLoad(script string) *redis.StringCmd }
RedisClient is a minimal client interface.
Click to show internal directories.
Click to hide internal directories.