Atomic Operations in Redis Using JavaScript

Overview of Redis Lua Scripting for Transactions

Welcome! Now, we are moving into another crucial topic: Redis Lua Scripting for Transactions.

In Redis, Lua scripts provide a powerful way to execute transactions atomically. Lua scripting allows you to bundle multiple commands into a single script, ensuring they are executed together without interruption. This lesson will introduce you to Lua scripting in Redis and show how it can enhance your transactions.

What You'll Learn

In this section, we'll cover how to use Lua scripting to make Redis transactions more efficient and atomic. You'll learn how to write a Lua script, use it to perform operations, and execute it within Redis.

Here's a glimpse of what you'll be working with:

import Redis from 'ioredis';

async function main() {
  const redis = new Redis();

  const luaScript = `
  local current = redis.call('get', KEYS[1]) -- Get the current value of the key 'counter'
  if current then
      current = tonumber(current) -- Convert the value to a number if it exists
      redis.call('set', KEYS[1], current + ARGV[1]) -- Increment the value by the argument passed to the script, 5 in this case
      return current + ARGV[1] -- Return the new value
  else
      redis.call('set', KEYS[1], ARGV[1]) -- Set the value to the argument (5) if the key doesn't exist
      return ARGV[1]  -- Return the new value
  end
  `;

  // Load the script into Redis and get the SHA1 hash
  const scriptSha = await redis.script('load', luaScript);

  // Use evalSha to run the loaded script
  const newCount = await redis.evalsha(scriptSha, 1, 'count', 5);

  console.log(newCount);

  await redis.quit();
}

main();

In this code snippet, we have a Lua script that executes atomically, ensuring that the operations are done together. Let's break down the Lua code and see how it works in Redis.

  • The KEYS variable holds the keys that the script will operate on — in this case, KEYS[1] is count. Note that Lua arrays are 1-based.
  • The ARGV variable holds the arguments passed to the script — in this case, ARGV[1] is 5.

In the Lua script, we perform the following operations:

  1. Get the current value of the key count.
  2. If the key exists, increment the value by the argument passed to the script, which is 5.
  3. If the key doesn't exist, set the value to the argument value, 5.
  4. Execute redis.call to interact with Redis and perform the set operation.

Finally, we load the Lua script into Redis using script('load', luaScript), which returns a SHA1 hash of the script. Then we execute the Lua script using the evalsha method on the Redis client. The script takes two arguments: the number of keys it operates on (one in this case) and the keys and arguments.

Note that the SHA1 hash of the script is used to identify the script in Redis, which allows you to execute the script multiple times without reloading it. This improves performance by reducing the overhead of loading the script each time.

Sign up

Join the 1M+ learners on CodeSignal

Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal