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);
    }
}