What if your Redis database could list millions of keys without ever slowing down or crashing?
Why SCAN for safe key iteration in Redis? - Purpose & Use Cases
Imagine you have a huge collection of keys in your Redis database, like thousands or millions of items, and you want to find or process them all one by one.
You try to list all keys at once using a command that grabs everything immediately.
This manual way is slow and risky because fetching all keys at once can freeze your database, making your app slow or even crash.
Also, if new keys are added or removed while you are reading, you might miss some or get duplicates.
The SCAN command helps by letting you safely and efficiently go through keys in small chunks.
It returns a few keys at a time and a cursor to continue from, so your database stays fast and responsive.
You can keep calling SCAN until you have seen all keys without blocking or crashing.
KEYS *
SCAN 0It enables smooth, safe, and scalable key iteration in Redis without risking performance or missing data.
For example, a developer wants to delete all keys matching a pattern but cannot afford to freeze the database; using SCAN, they can delete keys in batches safely.
Manual key listing can freeze Redis and cause errors.
SCAN returns keys in small parts with a cursor for safe iteration.
This keeps Redis fast and reliable even with many keys.
Practice
SCAN over KEYS in Redis for iterating keys?Solution
Step 1: Understand
KEYSbehaviorKEYSreturns all matching keys at once and blocks Redis during execution.Step 2: Understand
SCANbehaviorSCANreturns keys in small batches without blocking Redis, allowing safe iteration.Final Answer:
SCANdoes not block Redis and returns keys in batches. -> Option DQuick Check:
Safe iteration =SCANnon-blocking [OK]
SCAN is non-blocking, KEYS blocks [OK]- Thinking
SCANreturns all keys at once - Confusing
SCANwith key deletion - Assuming
SCANonly works on sorted sets
SCAN iteration from the beginning in Redis CLI?Solution
Step 1: Identify the starting cursor for SCAN
TheSCANcommand requires a cursor argument; starting cursor is always0.Step 2: Check options for correct cursor
SCAN 0starts iteration from the beginning; other options are invalid.Final Answer:
SCAN 0 -> Option BQuick Check:
Start cursor = 0 [OK]
SCAN with cursor 0 [OK]- Starting with cursor 1 instead of 0
- Using wildcard * as cursor
- Using invalid strings like 'start'
SCAN command?
SET user:1 Alice SET user:2 Bob SET admin:1 Carol SCAN 0 MATCH user:*
Solution
Step 1: Understand
TheSCANwith MATCHMATCH user:*filters keys starting with 'user:'. So keys 'user:1' and 'user:2' match; 'admin:1' does not.Step 2: Understand
SCANoutput formatSCANreturns a two-element array: a cursor (string) and a list of keys matching the pattern in this batch. Cursor is not necessarily 0 unless iteration is complete.Final Answer:
[cursor, ["user:1", "user:2"]] -> Option AQuick Check:
Filtered keys = user keys only [OK]
- Expecting cursor 0 on first SCAN call
- Including keys not matching pattern
- Confusing cursor with count
SCAN 0 MATCH user:*But you notice it returns only a partial list of keys matching the pattern. What is the likely mistake?
Solution
Step 1: Understand SCAN iteration process
SCANreturns a cursor and a batch of keys; to get all keys, you must repeatSCANwith the new cursor until it returns 0.Step 2: Identify the mistake
RunningSCAN 0 MATCH user:*only once returns partial keys; not looping causes incomplete results.Final Answer:
Not repeating SCAN with the returned cursor until it returns 0. -> Option AQuick Check:
Repeat SCAN until cursor 0 [OK]
- Expecting all keys in one SCAN call
- Misusing MATCH pattern syntax
- Starting with wrong cursor
session: in Redis but avoid blocking the server. You also want to limit each batch to about 10 keys. Which command sequence correctly achieves this?Solution
Step 1: Use SCAN with MATCH and COUNT
To filter keys starting with 'session:' and limit batch size, useMATCH session:*andCOUNT 10.Step 2: Repeat SCAN calls until cursor is 0
Iterate by passing the returned cursor each time until it returns 0 to get all keys safely without blocking.Final Answer:
RepeatSCAN cursor MATCH session:* COUNT 10until cursor returns 0. -> Option CQuick Check:
Safe iteration + filter + batch size = RepeatSCAN cursor MATCH session:* COUNT 10until cursor returns 0. [OK]
- Using KEYS which blocks Redis
- Not looping SCAN calls
- Omitting MATCH or COUNT when needed
Ready to prove it?
Pass the test and this pattern moves unknown
