Bird
Raised Fist0
Redisquery~5 mins

Lua script syntax in Redis - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of using Lua scripts in Redis?
Lua scripts in Redis allow you to run multiple commands atomically and efficiently on the server side, reducing network overhead and ensuring data consistency.
Click to reveal answer
beginner
How do you start a Lua script in Redis?
You start a Lua script in Redis by using the EVAL command followed by the Lua code as a string, the number of keys, and the keys and arguments.
Click to reveal answer
beginner
In Redis Lua scripts, how do you access the keys and arguments passed to the script?
Keys are accessed using the global table KEYS (e.g., KEYS[1]), and arguments are accessed using the global table ARGV (e.g., ARGV[1]).
Click to reveal answer
beginner
What does the following Lua script do in Redis?
return redis.call('GET', KEYS[1])
This script returns the value of the key passed as the first key argument to the script by calling the Redis GET command.
Click to reveal answer
intermediate
How do you return multiple values from a Lua script in Redis?
You return multiple values by returning a Lua table (array) with the values, for example:
return {value1, value2}
. Redis converts this to a multi-bulk reply.
Click to reveal answer
Which command is used to run a Lua script in Redis?
ARUN
BEXEC
CEVAL
DSCRIPT
In a Redis Lua script, how do you access the first key passed to the script?
AKEYS[1]
BKEYS[0]
CARGV[1]
DARGV[0]
What does redis.call('SET', KEYS[1], ARGV[1]) do in a Lua script?
ADeletes a key
BIncrements a key
CGets the value of a key
DSets the value of a key
What type of value should a Lua script return to send multiple values back to Redis?
AA number
BA Lua table (array)
CA string
DA boolean
Which of the following is true about Lua scripts in Redis?
AThey run atomically
BThey require restarting Redis
CThey cannot access Redis commands
DThey run asynchronously
Explain how to write and run a simple Lua script in Redis that gets the value of a key.
Think about how Redis passes keys and how Lua calls Redis commands.
You got /4 concepts.
    Describe how Lua scripts in Redis handle multiple keys and arguments and how you access them inside the script.
    Remember KEYS and ARGV are global tables in Lua scripts.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the correct way to start a Lua script in Redis using the EVAL command?
      easy
      A. EVAL redis.call('PING') 0
      B. EVAL 'return redis.call("PING")' 0
      C. EVAL 'PING' 0
      D. EVAL return redis.call('PING') 0

      Solution

      1. Step 1: Understand EVAL syntax

        The EVAL command requires a Lua script as a string, followed by the number of keys and then the keys and arguments.
      2. Step 2: Check correct Lua script format

        The Lua script must be a string and use redis.call to execute Redis commands, e.g., return redis.call("PING").
      3. Final Answer:

        EVAL 'return redis.call("PING")' 0 -> Option B
      4. Quick Check:

        EVAL with Lua string and 0 keys = A [OK]
      Hint: EVAL needs Lua code as string, then number of keys [OK]
      Common Mistakes:
      • Not passing Lua code as a string
      • Missing return statement in Lua script
      • Incorrect number of keys argument
      • Using Redis commands directly without redis.call
      2. Which of the following is the correct syntax to call the Redis command SET inside a Lua script?
      easy
      A. redis.call('SET', 'key', 'value')
      B. redis.SET('key', 'value')
      C. call.redis('SET', 'key', 'value')
      D. redis.call.SET('key', 'value')

      Solution

      1. Step 1: Recall Redis Lua API

        In Lua scripts for Redis, commands are called using redis.call with the command name as first argument.
      2. Step 2: Check syntax correctness

        The correct syntax is redis.call('SET', 'key', 'value'). Other options misuse the API or method calls.
      3. Final Answer:

        redis.call('SET', 'key', 'value') -> Option A
      4. Quick Check:

        Use redis.call('COMMAND', args...) = B [OK]
      Hint: Use redis.call('COMMAND', args) to run Redis commands in Lua [OK]
      Common Mistakes:
      • Using dot notation like redis.SET
      • Swapping order of arguments
      • Using call.redis instead of redis.call
      • Missing quotes around command name
      3. What will the following Lua script return when run with EVAL in Redis?
      return redis.call('INCR', KEYS[1])

      Assuming the key counter does not exist before and the script is called with KEYS[1] = 'counter'.
      medium
      A. 0
      B. Error
      C. nil
      D. 1

      Solution

      1. Step 1: Understand INCR behavior on non-existing key

        INCR command creates the key with value 0 then increments it by 1, so the new value is 1.
      2. Step 2: Return value of redis.call('INCR', key)

        The call returns the new value after increment, which is 1.
      3. Final Answer:

        1 -> Option D
      4. Quick Check:

        INCR on new key returns 1 [OK]
      Hint: INCR on missing key returns 1 after creating it [OK]
      Common Mistakes:
      • Assuming INCR returns 0 on new key
      • Expecting nil for missing key
      • Confusing return value with command success
      • Not passing KEYS argument correctly
      4. Identify the error in this Lua script for Redis:
      local val = redis.call('GET', KEYS[1])
      if val == nil then
        redis.call('SET', KEYS[1], '1')
      else
        redis.call('INCR', KEYS[1])
      end
      return redis.call('GET', KEYS[1])
      medium
      A. Using local variable val is not allowed
      B. Missing return statement in Lua script
      C. Using redis.call('INCR') on a string value causes error
      D. Incorrect use of KEYS array index

      Solution

      1. Step 1: Review the script logic

        The script fetches the value with GET. If nil, sets to '1'; else calls INCR, then returns the final GET.
      2. Step 2: Spot the problem with INCR

        redis.call('INCR', KEYS[1]) will raise an error if the key's existing value is a non-integer string (e.g., 'abc'). The script does not validate the value type before incrementing.
      3. Step 3: Rule out other options

        There is a return statement (not B), local variables are allowed in Redis Lua (not C), and KEYS[1] uses correct 1-based indexing (not D).
      4. Final Answer:

        Using redis.call('INCR') on a string value causes error -> Option C
      5. Quick Check:

        INCR errors on non-integer strings [OK]
      Hint: INCR works on strings representing integers only [OK]
      Common Mistakes:
      • Thinking INCR fails on string '1'
      • Confusing local variable usage
      • Assuming missing return statement
      • Misusing KEYS index
      5. You want to atomically increment a counter only if it exists in Redis using a Lua script. Which script correctly implements this?
      -- Option A
      if redis.call('EXISTS', KEYS[1]) == 1 then
        return redis.call('INCR', KEYS[1])
      else
        return nil
      end
      
      -- Option B
      return redis.call('INCR', KEYS[1])
      
      -- Option C
      if redis.call('GET', KEYS[1]) then
        redis.call('INCR', KEYS[1])
      end
      return redis.call('GET', KEYS[1])
      
      -- Option D
      if redis.call('EXISTS', KEYS[1]) == 0 then
        return redis.call('INCR', KEYS[1])
      else
        return nil
      end
      hard
      A. Option A
      B. Option B
      C. Option C
      D. Option D

      Solution

      1. Step 1: Understand requirement

        Increment counter only if it exists. If not, return nil without creating it.
      2. Step 2: Analyze the scripts

        The script checking redis.call('EXISTS', KEYS[1]) == 1 then returning redis.call('INCR', KEYS[1]) else nil matches exactly.
        One script calls INCR unconditionally, creating if missing.
        Another checks if redis.call('GET', KEYS[1]) (truthy for any non-nil), calls INCR but returns subsequent GET (may error on non-integers or not return increment directly).
        The last increments if EXISTS == 0, opposite of needed.
      3. Final Answer:

        Option A -> Option A
      4. Quick Check:

        Check EXISTS before INCR to avoid creating key [OK]
      Hint: Check EXISTS == 1 before INCR to avoid creating new key [OK]
      Common Mistakes:
      • Incrementing without checking key existence
      • Using EXISTS == 0 to increment
      • Not returning correct value after increment
      • Using GET without handling nil properly
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard