Mutex and Semaphore implementations based on Redis ready for distributed systems
- Fail-safe (all actions performed by LUA scripts (atomic))
new Mutex(redisClient, key [, { lockTimeout = 10000, acquireTimeout = 10000, retryInterval = 10, refreshInterval = acquireTimeout * 0.8 }])
redisClient
- required, configuredredis
clientkey
- required, key for locking resource (final key in redis:mutex:<key>
)timeouts
optionallockTimeout
- ms, time after mutex will be auto released (expired)acquireTimeout
- ms, max timeout for.acquire()
callretryInterval
- ms, time between acquire attempts if resource lockedrefreshInterval
- ms, auto-refresh interval
const Mutex = require('redis-semaphore').Mutex
const redis = require('redis')
const redisClient = redis.createClient()
async function doSomething() {
const mutex = new Mutex(redisClient, 'lockingResource')
await mutex.acquire()
// critical code
await mutex.release()
}
new Semaphore(redisClient, key, maxCount [, { lockTimeout = 10000, acquireTimeout = 10000, retryInterval = 10, refreshInterval = acquireTimeout * 0.8 }])
redisClient
- required, configuredredis
clientkey
- required, key for locking resource (final key in redis:semaphore:<key>
)maxCount
- required, maximum simultaneously resource usage counttimeouts
optionallockTimeout
- ms, time after semaphore will be auto released (expired)acquireTimeout
- ms, max timeout for.acquire()
callretryInterval
- ms, time between acquire attempts if resource lockedrefreshInterval
- ms, auto-refresh interval
const Semaphore = require('redis-semaphore').Semaphore
const redis = require('redis')
const redisClient = redis.createClient()
async function doSomething() {
const semaphore = new Semaphore(redisClient, 'lockingResource', 5)
await semaphore.acquire()
// maximum 5 simultaneously executions
await semaphore.release()
}
npm install --save redis-semaphore
# or
yarn add redis-semaphore
MIT