Open PortfolioOpen Portfolio.
← Back to Blog

How to Use Redis for Distributed Locking

July 25, 2026at 2:01 PM UTCBy Pocket Portfolio TeamTechnology
How to Use Redis for Distributed Locking
#redis#distributed#locking#concurrency

Problem

In distributed systems, managing concurrent access to shared resources can be challenging. Without proper control, race conditions can lead to inconsistent states and data corruption. Traditional locking mechanisms often fail in distributed settings due to their single-node nature, thus necessitating a distributed locking solution.

Solution with Code

Redis provides a robust solution for distributed locking through its SET command with options that allow atomic operations. Here’s a step-by-step guide to implementing a distributed lock using Redis.

Key Concepts

  • Atomic Operations: Operations in Redis execute in a single step, ensuring no other operations can interleave.
  • Expiration: Locks should have an expiration time to avoid deadlocks if a process crashes while holding a lock.
  • Uniqueness: Each lock should be associated with a unique identifier to ensure only the lock owner can release it.

Implementation

  1. Acquire a Lock

    Use the SET command with the NX (only set if not exists) and PX (set expiration in milliseconds) options to acquire a lock.

    const acquireLock = async (client, lockKey, lockId, ttl) => {
      const result = await client.set(lockKey, lockId, 'NX', 'PX', ttl);
      return result === 'OK';
    };
    
    • lockKey: The key representing the lock.
    • lockId: A unique identifier (e.g., UUID) for the lock owner.
    • ttl: Time-to-live for the lock in milliseconds.
  2. Release a Lock

    Use a Lua script to release the lock. This ensures atomicity—check if the lock is held by the current owner before deleting it.

    const releaseLock = async (client, lockKey, lockId) => {
      const script = `
        if redis.call("GET", KEYS[1]) == ARGV[1] then
          return redis.call("DEL", KEYS[1])
        else
          return 0
        end
      `;
      return await client.eval(script, 1, lockKey, lockId);
    };
    
  3. Usage Example

    const { createClient } = require('redis');
    const client = createClient();
    
    const lockKey = 'resource-lock';
    const lockId = 'unique-id';
    const ttl = 10000; // 10 seconds
    
    client.connect().then(async () => {
      if (await acquireLock(client, lockKey, lockId, ttl)) {
        console.log('Lock acquired');
        // Perform operations on shared resource
    
        // Release lock after operations
        await releaseLock(client, lockKey, lockId);
        console.log('Lock released');
      } else {
        console.log('Failed to acquire lock');
      }
    
      client.quit();
    });
    

Conclusion

By leveraging Redis for distributed locking, you can manage concurrent access to resources across distributed systems effectively. The atomicity and expiration features in Redis ensure that locks are both reliable and efficient, reducing the risk of deadlocks and race conditions.

How to Use Redis for Distributed Locking | Open Portfolio Blog | Open Portfolio