public final class RedisLockRegistry extends Object implements LockRegistry
LockRegistry
providing a distributed lock using Redis.
Locks are stored under the key registryKey:lockKey
. Locks expire after
(default 60) seconds. Threads unlocking an
expired lock will get an IllegalStateException
. This should be
considered as a critical error because it is possible the protected
resources were compromised.
Locks are reentrant.
However, locks are scoped by the registry; a lock from a different registry with the same key (even if the registry uses the same 'registryKey') are different locks, and the second cannot be acquired by the same thread while the first is locked.
Note: This is not intended for low latency applications. It is intended for resource locking across multiple JVMs. When a lock is released by a remote system, waiting threads may take up to 100ms to acquire the lock. A more performant version would need to get notifications from the Redis stores of key changes. This is currently only available using the SYNC command.
This limitation will usually not apply when a lock is released within this registry,
unless another system takes the lock after the local lock is acquired here.
A DefaultLockRegistry
is used internally to achieve this optimization.
Condition
s are not supported.
Constructor and Description |
---|
RedisLockRegistry(RedisConnectionFactory connectionFactory,
String registryKey)
Constructs a lock registry with the default (60 second) lock expiration and a default
local
DefaultLockRegistry . |
RedisLockRegistry(RedisConnectionFactory connectionFactory,
String registryKey,
long expireAfter)
Constructs a lock registry with the supplied lock expiration and a default
local
DefaultLockRegistry . |
RedisLockRegistry(RedisConnectionFactory connectionFactory,
String registryKey,
long expireAfter,
LockRegistry localRegistry)
Deprecated.
since 4.3.10, will be removed in 5.0, - the
localRegistry isn't used any more |
Modifier and Type | Method and Description |
---|---|
Collection<Lock> |
listLocks()
Deprecated.
since 4.3.10, will be removed in 5.0 to avoid deserialized locks created in different process
|
Lock |
obtain(Object lockKey)
Obtains the lock associated with the parameter object.
|
void |
setUseWeakReferences(boolean useWeakReferences)
Deprecated.
since 4.3.10, will be removed in 5.0, - the thread local cache isn't used any more
|
public RedisLockRegistry(RedisConnectionFactory connectionFactory, String registryKey)
DefaultLockRegistry
.connectionFactory
- The connection factory.registryKey
- The key prefix for locks.public RedisLockRegistry(RedisConnectionFactory connectionFactory, String registryKey, long expireAfter)
DefaultLockRegistry
.connectionFactory
- The connection factory.registryKey
- The key prefix for locks.expireAfter
- The expiration in milliseconds.@Deprecated public RedisLockRegistry(RedisConnectionFactory connectionFactory, String registryKey, long expireAfter, LockRegistry localRegistry)
localRegistry
isn't used any moreLockRegistry
.connectionFactory
- The connection factory.registryKey
- The key prefix for locks.expireAfter
- The expiration in milliseconds.localRegistry
- The local registry used to reduce wait time,
DefaultLockRegistry
is used by default.@Deprecated public void setUseWeakReferences(boolean useWeakReferences)
RedisLock
object for certain key before actual
locking and after unlocking (if variable still exists).
While is switched off (by default) every obtain(java.lang.Object)
call will provide
different RedisLock
objects for same unlocked key.
useWeakReferences
- set to true for switch thread local weak references storage on, false by defaultpublic Lock obtain(Object lockKey)
LockRegistry
obtain
in interface LockRegistry
lockKey
- The object with which the lock is associated.@Deprecated public Collection<Lock> listLocks()
registryKey
.registryKey