Back to Demos
Distributed Lock
Redis-based lock with auto-release based on CacheService pattern
Lock Controls
Lock Attempts History
Production Code (Java)
// From transaction-realtime-tracking - CacheService interface
public interface CacheService {
/**
* Try to acquire a distributed lock without blocking.
* @param key Lock key
* @param leaseTimeSeconds Auto-release time in seconds
* @return Optional containing lock if acquired, empty if held by another node
*/
Optional<AcquiredLock> tryAcquireLock(String key, long leaseTimeSeconds);
}
// Usage in DailySuspiciousUserScheduler
@Scheduled(cron = "0 5 0 * * ?")
public void exportSuspiciousUsers() {
String lockKey = SCHEDULER_LOCK_KEY + ":" + yesterday;
// Try to acquire lock (non-blocking)
Optional<AcquiredLock> lockOpt = cacheService.tryAcquireLock(lockKey, 60);
if (lockOpt.isEmpty()) {
log.info("Skipping - another node is processing");
return;
}
try (AcquiredLock lock = lockOpt.get()) {
// Do work...
exportSuspiciousUsersForDate(yesterday);
// Mark as processed with 24h TTL
cacheService.set(processedKey, "done", 24, TimeUnit.HOURS);
}
}