Redlocker
Acquire and keep distributed locks alive using redis
There are already quite some ruby libraries available which use redis for the purpose of distributed locking, but they require you to specify the time time-to-live of your locks. Contrary, Redlocker allows you to easily acquire and keep distributed locks alive using redis. An acquired lock gets automatically renewed every second from a thread, i.e. its 5 second expiry value gets renewed in redis every second, and it gets released as soon as the given block finishes.
Installation
Add this line to your application's Gemfile:
gem 'redlocker'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install redlocker
Usage
Using Redlocker could not be easier:
RedlockerClient = Redlocker::Client.new(redis: Redis.new)
RedlockerClient.with_lock('some_lock', timeout: 5) do
# lock acquired
end
If the lock can not be acquired within the specified timeout
, a
Redlocker::TimeoutError
is raised.
When the block finishes or raises, the acquired lock gets freed.
You can optionally pass a delay
when acquiring a lock, which specifies the
time to wait between subsequent calls which check in redis whether or not the
lock is free. Default is 0.25 seconds:
RedlockerClient.with_lock("some lock", timeout: 5, delay: 1) do
# lock acquired
end
If you are using a shared redis, you can pass a namespace, which will be used for
prefixing redis keys in addition to the default redlocker:
namespace.
RedlockerClient = Redlocker::Client.new(redis: Redis.new, namespace: "my-namespace")
That's it.
Reference docs
Please find the reference docs at http://www.rubydoc.info/github/mrkamel/redlocker
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run
bundle exec rspec
to run the tests. You can also run bin/console
for an
interactive prompt that will allow you to experiment.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/mrkamel/redlocker.
License
The gem is available as open source under the terms of the MIT License.