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
✗ Incorrect
The EVAL command runs Lua scripts in Redis.
In a Redis Lua script, how do you access the first key passed to the script?
AKEYS[1]
BKEYS[0]
CARGV[1]
DARGV[0]
✗ Incorrect
Keys are accessed via KEYS table starting at index 1.
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
✗ Incorrect
It sets the value of the key KEYS[1] to the value ARGV[1].
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
✗ Incorrect
Returning a Lua table sends multiple values as a multi-bulk reply.
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
✗ Incorrect
Lua scripts run atomically in Redis, ensuring no other commands run during their execution.
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
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.
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").
Final Answer:
EVAL 'return redis.call("PING")' 0 -> Option B
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
Step 1: Recall Redis Lua API
In Lua scripts for Redis, commands are called using redis.call with the command name as first argument.
Step 2: Check syntax correctness
The correct syntax is redis.call('SET', 'key', 'value'). Other options misuse the API or method calls.
Final Answer:
redis.call('SET', 'key', 'value') -> Option A
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
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.
Step 2: Return value of redis.call('INCR', key)
The call returns the new value after increment, which is 1.
Final Answer:
1 -> Option D
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
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.
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.
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).
Final Answer:
Using redis.call('INCR') on a string value causes error -> Option C
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
Step 1: Understand requirement
Increment counter only if it exists. If not, return nil without creating it.
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.
Final Answer:
Option A -> Option A
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 unknownstrongwhile earning +1 Grip toward your certificate.