mirror of
https://github.com/dkam/suo.git
synced 2025-01-29 07:42:43 +00:00
49a9757d44d568674659c5045ec7a8e323d770f4
Suo

🔒 Distributed semaphores using Memcached or Redis in Ruby.
Suo provides a very performant distributed lock solution using Compare-And-Set (CAS) commands in Memcached, and WATCH/MULTI in Redis.
Installation
Add this line to your application’s Gemfile:
gem 'suo'
Usage
Basic
# Memcached
suo = Suo::Client::Memcached.new(connection: "127.0.0.1:11211")
# Redis
suo = Suo::Client::Redis.new(connection: {host: "10.0.1.1"})
# Pre-existing client
suo = Suo::Client::Memcached.new(client: some_dalli_client)
suo.lock("some_key") do
# critical code here
@puppies.pet!
end
Thread.new { suo.lock("other_key", 2) { puts "One"; sleep 2 } }
Thread.new { suo.lock("other_key", 2) { puts "Two"; sleep 2 } }
Thread.new { suo.lock("other_key", 2) { puts "Three" } }
# will print "One" "Two", but not "Three", as there are only 2 resources
# custom acquisition timeouts (time to acquire)
suo = Suo::Client::Memcached.new(client: some_dalli_client, acquisition_timeout: 1) # in seconds
# manually locking/unlocking
suo.lock("a_key")
foo.baz!
suo.unlock("a_key")
# custom stale lock cleanup (cleaning of dead clients)
suo = Suo::Client::Redis.new(client: some_redis_client, stale_lock_expiration: 60*5)
TODO
- better stale key handling (refresh blocks)
- more race condition tests
History
View the changelog
Contributing
Everyone is encouraged to help improve this project. Here are a few ways you can help:
- Report bugs
- Fix bugs and submit pull requests
- Write, clarify, or fix documentation
- Suggest or add new features
Description
Languages
Ruby
99.7%
Shell
0.3%