📖 Scenario: You are managing a Redis database for a small online store. You want to use Lua scripts to perform operations efficiently. To avoid sending the full script every time, you will cache the script in Redis and use its SHA1 hash to run it quickly.
🎯 Goal: Build a Redis Lua script caching workflow using EVALSHA to run a cached script that increments a product's stock count.
📋 What You'll Learn
Create a Lua script that increments a product stock by a given amount.
Load the script into Redis and get its SHA1 hash.
Store the SHA1 hash in a variable called script_sha.
Use EVALSHA with script_sha to increment the stock count.
Handle the case where the script is not cached by loading it again.
💡 Why This Matters
🌍 Real World
Caching Lua scripts in Redis is common in real-world applications to speed up repeated script execution and reduce network traffic.
💼 Career
Understanding <code>EVALSHA</code> and script caching is valuable for backend developers and database administrators working with Redis.
Progress0 / 4 steps
1
Create the Lua script to increment stock
Create a variable called lua_script and assign it this exact Lua script as a string: return redis.call('INCRBY', KEYS[1], ARGV[1])
Redis
Hint
This Lua script uses redis.call('INCRBY', ...) to increase a key's value by a given number.
2
Load the Lua script into Redis and get SHA1 hash
Use the Redis command SCRIPT LOAD with lua_script to load the script and store the returned SHA1 hash in a variable called script_sha.
Redis
Hint
Use redis.call('SCRIPT', 'LOAD', lua_script) to load the script and get its SHA1 hash.
3
Use EVALSHA to increment stock count
Use redis.call with 'EVALSHA', the variable script_sha, 1 for the number of keys, the key 'product_stock', and the increment amount '5' as arguments to run the cached script.
Redis
Hint
Use redis.call('EVALSHA', script_sha, 1, 'product_stock', '5') to run the cached script.
4
Handle missing cached script by loading again
Add a check: if redis.call('EVALSHA', script_sha, 1, 'product_stock', '5') fails with a NOSCRIPT error, reload the script with SCRIPT LOAD and run EVALSHA again.
Redis
Hint
Use pcall to catch errors and check if the error message contains 'NOSCRIPT'. If yes, reload the script and run EVALSHA again.
Practice
(1/5)
1. What does the Redis command EVALSHA primarily do?
easy
A. Uploads a new Lua script to Redis cache
B. Deletes a script from the cache by its SHA1 hash
C. Lists all cached scripts by their SHA1 hashes
D. Runs a cached Lua script using its SHA1 hash
Solution
Step 1: Understand the purpose of EVALSHA
EVALSHA runs a Lua script already stored in Redis cache using its SHA1 hash instead of sending the full script text.
Step 2: Compare with other script commands
Other commands like SCRIPT LOAD upload scripts, SCRIPT FLUSH deletes scripts, but EVALSHA executes cached scripts.
Final Answer:
Runs a cached Lua script using its SHA1 hash -> Option D
Quick Check:
EVALSHA = run cached script [OK]
Hint: EVALSHA runs scripts by hash, not by full text [OK]
Common Mistakes:
Confusing EVALSHA with SCRIPT LOAD
Thinking EVALSHA deletes scripts
Assuming EVALSHA lists scripts
2. Which of the following is the correct syntax for using EVALSHA in Redis?
easy
A. EVALSHA <numkeys> <sha1> [key1 key2 ...] [arg1 arg2 ...]
B. EVALSHA <sha1> <numkeys> [key1 key2 ...] [arg1 arg2 ...]
C. EVALSHA <sha1> [key1 key2 ...] <numkeys> [arg1 arg2 ...]
D. EVALSHA <script> <numkeys> [key1 key2 ...] [arg1 arg2 ...]
Solution
Step 1: Recall EVALSHA syntax
The correct syntax is: EVALSHA followed by the SHA1 hash, then the number of keys, then the keys, then the arguments.
Step 2: Check option formats
EVALSHA <sha1> <numkeys> [key1 key2 ...] [arg1 arg2 ...] matches the correct order. Options A, B, and C have wrong order or use script text instead of SHA1.
4. You run the command EVALSHA deadbeef 2 key1 key2 arg1 but get the error NOSCRIPT No matching script. What is the most likely cause?
medium
A. The number of keys argument should be 1, not 2
B. You provided too many keys for the script
C. The SHA1 hash 'deadbeef' is not loaded in Redis script cache
D. The script syntax is invalid
Solution
Step 1: Understand NOSCRIPT error meaning
This error means Redis does not have a cached script matching the given SHA1 hash.
Step 2: Check command usage
Since the hash 'deadbeef' is not loaded, Redis cannot run the script. Number of keys or syntax errors cause different errors.
Final Answer:
The SHA1 hash 'deadbeef' is not loaded in Redis script cache -> Option C
Quick Check:
NOSCRIPT = missing cached script [OK]
Hint: NOSCRIPT means script hash not cached yet [OK]
Common Mistakes:
Assuming wrong number of keys causes NOSCRIPT
Thinking syntax error causes NOSCRIPT
Ignoring that script must be loaded first
5. You want to optimize a Redis Lua script execution by caching it. Which sequence correctly uses SCRIPT LOAD and EVALSHA to run the script multiple times with different keys and arguments?
hard
A. Load script once with SCRIPT LOAD, save SHA1, then call EVALSHA with SHA1, numkeys, keys, args each time
B. Call EVALSHA with script text each time, no need to load script
C. Use SCRIPT FLUSH before every EVALSHA to clear cache
D. Call EVALSHA with SHA1 but always set numkeys to 0
Solution
Step 1: Understand caching workflow
First, SCRIPT LOAD uploads the script and returns its SHA1 hash. This hash is saved for reuse.
Step 2: Use EVALSHA for repeated execution
Use EVALSHA with the saved SHA1, specifying number of keys, keys, and arguments to run the script efficiently multiple times.
Final Answer:
Load script once with SCRIPT LOAD, save SHA1, then call EVALSHA with SHA1, numkeys, keys, args each time -> Option A
Quick Check:
Load once, run many times with EVALSHA [OK]
Hint: Load script once, then run with EVALSHA and SHA1 [OK]
Common Mistakes:
Calling EVALSHA with script text instead of SHA1
Flushing scripts before every run
Setting numkeys incorrectly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.