/red_mutex

Redlock (Redis Distributed Lock) implementation

Primary LanguageElixirApache License 2.0Apache-2.0

RedMutex

RedMutex defines an easy to use interface to control an distributed lock backed by redis.

Hex.pm Version CI Coverage Status

Usage

When used, the mutex expects the :otp_app as option. The :otp_app should point to an OTP application that has the mutex configuration. For example, the mutex:

defmodule MyApp.MyMutex do
  use RedMutex, otp_app: :my_app
end

Could be configured with:

config :my_app, MyApp.MyMutex,
  url: "redis://localhost:6379",
  key: "red_mutex_lock",
  expiration_in_seconds: 3_600

Options:

  • :url - the redis url. Required.
  • :key- The key at redis used to store the lock information. Defaults to "red_mutex_lock".
  • :expiration_in_seconds - Time in seconds that the resource will be kept locked. After that time the lock will be automattically released. Defaults to 3600, one hour.

Example

# In your config/config.exs file
config :my_app, MyApp.MyMutex,
  url: "redis://localhost:6379",
  key: "red_mutex_lock",
  expiration_in_seconds: 3_600

# In your application code
defmodule MyApp.MyMutex do
  use RedMutex, otp_app: :my_app
end

defmodule MyApp do
  import RedMutex, only: [synchronize: 1]
  alias MyApp.MyMutex

  def syncronized_work do
    synchronize({__MODULE__, :work, []})
  end

  def lock_unlock do
    case MyMutex.acquire_lock() do
      {:ok, lock} ->
        work()
        MyMutex.release_lock(lock)

      {:error, reason} -> {:error, reason}
    end
  end

  def work do
    # do some work
    {:ok, "completed"}
  end
end

Installation

The package can be installed by adding red_mutex to your list of dependencies in mix.exs:

def deps do
  [
    {:red_mutex, "~> 0.3.0"}
  ]
end

The docs can be found at https://hexdocs.pm/red_mutex.

Contributing

See the contributing file.

License

Apache License, Version 2.0 © Thiago Santos