Understanding Transactions vs Lua Scripts in Redis
📖 Scenario: You are managing a Redis database for a simple online store. You want to update the stock quantity of a product safely when a purchase happens. You will learn how to do this using Redis transactions and Lua scripts.
🎯 Goal: Build two Redis commands: one using a transaction with MULTI and EXEC, and another using a Lua script to update product stock atomically.
📋 What You'll Learn
Create a Redis key product:1001:stock with initial stock value 10
Use a Redis transaction to decrement stock by 1 safely
Write a Lua script to decrement stock by 1 atomically
Ensure the stock does not go below zero in both methods
💡 Why This Matters
🌍 Real World
Managing inventory stock safely in an online store to prevent overselling.
💼 Career
Understanding Redis transactions and Lua scripting is essential for backend developers working with Redis to ensure data consistency and atomic operations.
Progress0 / 4 steps
1
DATA SETUP: Create the initial stock key
Create a Redis key called product:1001:stock and set its value to 10 using the SET command.
Redis
Hint
Use the SET command with the key product:1001:stock and value 10.
2
CONFIGURATION: Start a transaction to decrement stock
Start a Redis transaction using the MULTI command to prepare for decrementing the stock.
Redis
Hint
Use the MULTI command to start a transaction block.
3
CORE LOGIC: Decrement stock safely inside the transaction
Within the transaction, use the DECRBY command on product:1001:stock to decrement the stock by 1. Then use EXEC to execute the transaction.
Redis
Hint
Use DECRBY product:1001:stock 1 inside the transaction, then EXEC to run it.
4
COMPLETION: Write a Lua script to decrement stock atomically
Write a Lua script that checks if product:1001:stock is greater than 0, then decrements it by 1 and returns the new stock. Use the EVAL command with this script.
Redis
Hint
Use EVAL with a Lua script that gets the stock, checks if it's above zero, decrements it, and returns the new value.
Practice
(1/5)
1. What is the main difference between Redis transactions and Lua scripts?
easy
A. Transactions run commands one by one, Lua scripts run commands outside Redis.
B. Transactions group commands to run atomically, Lua scripts run complex logic atomically inside Redis.
C. Transactions can only read data, Lua scripts can only write data.
D. Transactions are faster than Lua scripts in all cases.
Solution
Step 1: Understand Redis transactions
Transactions group multiple commands to run atomically, meaning all commands succeed or none do.
Step 2: Understand Lua scripts in Redis
Lua scripts run inside Redis and can include complex logic, running atomically as a single operation.
Final Answer:
Transactions group commands to run atomically, Lua scripts run complex logic atomically inside Redis. -> Option B
Quick Check:
Transactions vs Lua scripts = Grouped commands vs complex logic [OK]
2. Which of the following is the correct way to start a Redis transaction?
easy
A. EXEC
B. START TRANSACTION
C. BEGIN
D. MULTI
Solution
Step 1: Recall Redis transaction commands
Redis uses the command MULTI to start a transaction block.
Step 2: Identify the correct command
START TRANSACTION and BEGIN are SQL commands, not Redis. EXEC ends the transaction.
Final Answer:
MULTI -> Option D
Quick Check:
Start Redis transaction = MULTI [OK]
Hint: Use MULTI to start Redis transactions, EXEC to finish [OK]
Common Mistakes:
Using SQL commands like START TRANSACTION
Confusing EXEC as start command
Using BEGIN which is not Redis syntax
3. Given this Lua script in Redis:
local current = redis.call('GET', KEYS[1])
if not current then
redis.call('SET', KEYS[1], ARGV[1])
return ARGV[1]
else
return current
end
What will be the output if the key does not exist and ARGV[1] is "100"?
medium
A. Error
B. nil
C. "100"
D. "0"
Solution
Step 1: Analyze the Lua script logic
The script checks if the key exists. If not, it sets the key to ARGV[1] and returns ARGV[1].
Step 2: Apply the input values
Since the key does not exist, it sets the key to "100" and returns "100".
Final Answer:
"100" -> Option C
Quick Check:
Key missing sets and returns ARGV[1] = "100" [OK]
Hint: If key missing, Lua sets and returns ARGV[1] [OK]
Common Mistakes:
Assuming nil is returned when key missing
Expecting an error from redis.call
Confusing return values with zero
4. You wrote this Redis transaction:
MULTI
SET key1 foo
INCR key1
EXEC
But the INCR command fails with an error. What is the likely cause?
medium
A. SET sets key1 as a string, INCR expects an integer value
B. INCR cannot be used inside MULTI blocks
C. EXEC was missing to run the transaction
D. MULTI command syntax is incorrect
Solution
Step 1: Understand SET and INCR behavior
SET stores the value as a string. INCR expects the key to hold an integer value.
Step 2: Identify the error cause
Since SET sets "foo" as a string, INCR fails because it cannot increment a non-integer string.
Final Answer:
SET sets key1 as a string, INCR expects an integer value -> Option A
Quick Check:
INCR needs integer, SET stores string [OK]
Hint: INCR needs integer; SET stores string by default [OK]
Common Mistakes:
Thinking INCR can't be in MULTI
Forgetting to EXEC the transaction
Assuming MULTI syntax is wrong
5. You want to atomically check if a key exists and increment it only if it does, otherwise set it to 1. Which approach is best in Redis?
hard
A. Use a Lua script that checks and updates the key atomically
B. Use Redis pipeline to send GET and INCR commands together
C. Run separate GET and INCR commands without transactions
D. Use a Redis transaction with WATCH, GET, and MULTI commands
Solution
Step 1: Understand the atomicity requirement
The operation must be atomic: check existence and update in one step without race conditions.
Step 2: Compare approaches
Transactions with WATCH can be complex and may fail due to race conditions. Separate commands or pipelines are not atomic. Lua scripts run atomically inside Redis and can handle logic safely.
Final Answer:
Use a Lua script that checks and updates the key atomically -> Option A
Quick Check:
Atomic check and update = Lua script [OK]
Hint: Use Lua scripts for atomic logic beyond simple transactions [OK]
Common Mistakes:
Assuming WATCH transactions are always safe
Using separate commands risking race conditions
Confusing pipelines with atomic execution
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.