RedMutex defines an easy to use interface to control an distributed lock backed by redis.
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 to3600
, one hour.
# 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
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.
See the contributing file.