Options
All
  • Public
  • Public/Protected
  • All
Menu

A Redis Locker that can be used as both:

  • a Read Write Locker that uses a (single) Redis server to store the locks and counts.
  • a Resource Locker that uses a (single) Redis server to store the lock. This solution should be process-safe. The only references to locks are string keys derived from identifier paths.

The Read Write algorithm roughly goes as follows:

  • Acquire a read lock: allowed as long as there is no write lock. On acquiring the read counter goes up.
  • Acquire a write lock: allowed as long as there is no other write lock AND the read counter is 0.
  • Release a read lock: decreases the read counter with 1
  • Release a write lock: unlocks the write lock

The Resource locking algorithm uses a single mutex/lock.

All operations, such as checking for a write lock AND read count, are executed in a single Lua script. These scripts are used by Redis as a single new command. Redis executes its operations in a single thread, as such, each such operation can be considered atomic.

The operation to (un)lock will always resolve with either 1/OK/true if succeeded or 0/false if not succeeded. Rejection with errors will be happen on actual failures. Retrying the (un)lock operations will be done by making use of the LockUtils' {@link retryFunctionUntil} function.

Hierarchy

  • RedisLocker

Implements

Index

Constructors

  • new RedisLocker(redisClient?: string, attemptSettings?: AttemptSettings): RedisLocker

Properties

attemptSettings: Required<AttemptSettings>
logger: Logger = ...
redis: Redis
redisLock: RedisResourceLock
redisRw: RedisReadWriteLock

Methods

  • createRedisClient(redisClientString: string): Redis
  • Generate and return a RedisClient based on the provided string

    Parameters

    • redisClientString: string

      A string that contains either a host address and a port number like '127.0.0.1:6379' or just a port number like '6379'.

    Returns Redis

  • finalize(): Promise<void>
  • Create a scoped Redis key for Read-Write locking.

    Parameters

    Returns string

    A scoped Redis key that allows cleanup afterwards without affecting other keys.

  • Create a scoped Redis key for Resource locking.

    Parameters

    Returns string

    A scoped Redis key that allows cleanup afterwards without affecting other keys.

  • swallowFalse(fn: () => Promise<RedisAnswer>): () => Promise<unknown>
  • Wrapper function for all (un)lock operations. If the fn() resolves to false (after applying {@link fromResp2ToBool}, the result will be swallowed. When fn() resolves to true, this wrapper will return true. Any error coming from fn() will be thrown.

    Parameters

    • fn: () => Promise<RedisAnswer>

      The function reference to swallow false from.

        • (): Promise<RedisAnswer>
        • Returns Promise<RedisAnswer>

    Returns () => Promise<unknown>

      • (): Promise<unknown>
      • Wrapper function for all (un)lock operations. If the fn() resolves to false (after applying {@link fromResp2ToBool}, the result will be swallowed. When fn() resolves to true, this wrapper will return true. Any error coming from fn() will be thrown.

        Returns Promise<unknown>

  • withReadLock<T>(identifier: ResourceIdentifier, whileLocked: () => T | Promise<T>): Promise<T>
  • Run the given function while the resource is locked. The lock will be released when the (async) input function resolves. This function should be used for operations that only require reading the resource.

    Type parameters

    • T

    Parameters

    • identifier: ResourceIdentifier
    • whileLocked: () => T | Promise<T>
        • (): T | Promise<T>
        • Returns T | Promise<T>

    Returns Promise<T>

    A promise resolving when the lock is released.

  • withWriteLock<T>(identifier: ResourceIdentifier, whileLocked: () => T | Promise<T>): Promise<T>
  • Run the given function while the resource is locked. The lock will be released when the (async) input function resolves. This function should be used for operations that could modify the resource.

    Type parameters

    • T

    Parameters

    • identifier: ResourceIdentifier
    • whileLocked: () => T | Promise<T>
        • (): T | Promise<T>
        • Returns T | Promise<T>

    Returns Promise<T>

    A promise resolving when the lock is released.