How to safely iterate over keys in production using the SCAN command?
Jul 09, 2025 am 12:52 AMHow to safely traverse Redis keys in production environments? Use the SCAN command. SCAN is a cursor iterative command of Redis, which traverses the key in incremental manner to avoid blocking the main thread. 1. Call the loop until the cursor is 0; 2. Set the COUNT parameter reasonably, default 10, and the amount of big data can be appropriately increased; 3. Filter specific mode keys in combination with MATCH; 4. Pay attention to the possible repeated return of keys, inability to ensure consistency, performance overhead and other issues; 5. Can be run during off-peak periods or processed asynchronously. For example: SCAN 0 MATCH user:* COUNT 100.
In the production environment, if you need to traverse the Redis key, it is not advisable to use the KEYS
command directly because it will block the Redis main thread and affect service performance. The SCAN
command is a safe alternative, which traverses the key incrementally without causing long blockages.
What is SCAN?
SCAN
is a cursor iterative command provided by Redis to gradually traverse key collections in the database. Unlike KEYS
, it returns only a portion of the results at a time and records the current progress through a cursor. The basic usage is as follows:
SCAN cursor [MATCH pattern] [COUNT count]
- cursor : start cursor, first call is 0.
- MATCH : Optional parameter to filter keys that match a specific pattern.
- COUNT : It is recommended to return the quantity, the default is 10, but the actual return quantity is not necessarily equal to the value.
How to properly traverse keys using SCAN?
To use SCAN
safely, you need to understand its execution process and some key considerations:
- Loop until the cursor is 0 : a new cursor is returned for each call, until the returned cursor is 0 indicates that the traversal is completed.
- Don't assume that the data remains unchanged : the keys in Redis may be modified, deleted or added, so
SCAN
does not guarantee a completely consistent result. - Reasonably set COUNT parameters : Usually the default value is enough, but it can be appropriately increased when the amount of data is large (such as 100~1000) to reduce the number of network round trips.
- Use in combination with MATCH : If you only want to scan for keys of certain prefixes or patterns, you can narrow the scope and improve efficiency through
MATCH
.
For example:
127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 100
How to implement SCAN in code?
Different language clients have slightly different encapsulation of SCAN
, but the general logic is the same. Take Python's redis-py
library as an example:
import redis client = redis.StrictRedis(host='localhost', port=6379, db=0) cursor = 0 While True: cursor, keys = client.scan(cursor, match="user:*", count=100) for key in keys: # Process each key, such as deletion, viewing, etc. print(key) if cursor == 0: break
What should be noted is:
- Each call to
scan()
returns a new cursor and a batch of keys. - Exit the loop when the cursor is 0.
- If the processing logic is heavy, you can add a queue to the queue for asynchronous processing after getting a batch of keys each time.
Limitations and Coping Methods of SCAN
While SCAN
is safe, it also has some limitations:
- Possible to return key repeatedly : Due to Redis dictionary expansion and other reasons, a key may appear in multiple batches.
- Unable to guarantee consistency : When production environment key changes frequently, the data returned by
SCAN
may be an incomplete view of "snapshot". - Performance overhead remains : while not blocking the main thread, frequent calls may still increase CPU and memory pressure.
To deal with these problems, you can:
- Run scan tasks during off-peak periods;
- For key operations (such as batch deletion), tests are performed first before going online;
- Combined with Lua scripts or batch processing, ensure logical idempotence and avoid repeated operation errors.
Basically that's it. The key to using SCAN is to understand that it is incremental and non-blocking, and also to note that it is not omnipotent.
The above is the detailed content of How to safely iterate over keys in production using the SCAN command?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

TransactionsensuredataintegrityinoperationslikedatabasechangesbyfollowingACIDprinciples,whilepipelinesautomateworkflowsacrossstages.1.Transactionsguaranteeall-or-nothingexecutiontomaintaindataconsistency,primarilyindatabases.2.Pipelinesstructureandau

ToswitchdatabasesinRedis,usetheSELECTcommandfollowedbythenumericindex.Redissupportsmultiplelogicaldatabases(default16),andeachclientconnectionmaintainsitsownselecteddatabase.1.UseSELECTindex(e.g.,SELECT2)toswitchtoanotherdatabase.2.Verifywithcommands

How to safely traverse Rediskey in production environment? Use the SCAN command. SCAN is a cursor iterative command of Redis, which traverses the key in incremental manner to avoid blocking the main thread. 1. Call the loop until the cursor is 0; 2. Set the COUNT parameter reasonably, default 10, and the amount of big data can be appropriately increased; 3. Filter specific mode keys in combination with MATCH; 4. Pay attention to the possible repeated return of keys, inability to ensure consistency, performance overhead and other issues; 5. Can be run during off-peak periods or processed asynchronously. For example: SCAN0MATChuser:*COUNT100.

To ensure Redis security, you need to configure from multiple aspects: 1. Restrict access sources, modify bind to specific IPs or combine firewall settings; 2. Enable password authentication, set strong passwords through requirepass and manage properly; 3. Close dangerous commands, use rename-command to disable high-risk operations such as FLUSHALL, CONFIG, etc.; 4. Enable TLS encrypted communication, suitable for high-security needs scenarios; 5. Regularly update the version and monitor logs to detect abnormalities and fix vulnerabilities in a timely manner. These measures jointly build the security line of Redis instances.

To configure the RDB snapshot saving policy for Redis, use the save directive in redis.conf to define the trigger condition. 1. The format is save. For example, save9001 means that if at least 1 key is modified every 900 seconds, it will be saved; 2. Select the appropriate value according to the application needs. High-traffic applications can set a shorter interval such as save101, and low-traffic can be extended such as save3001; 3. If automatic snapshots are not required, RDB can be disabled through save""; 4. After modification, restart Redis and monitor logs and system load to ensure that the configuration takes effect and does not affect performance.

Redis master-slave replication achieves data consistency through full synchronization and incremental synchronization. During the first connection, the slave node sends a PSYNC command, the master node generates an RDB file and sends it, and then sends the write command in the cache to complete the initialization; subsequently, incremental synchronization is performed by copying the backlog buffer to reduce resource consumption. Its common uses include read and write separation, failover preparation and data backup analysis. Notes include: ensuring network stability, reasonably configuring timeout parameters, enabling the min-slaves-to-write option according to needs, and combining Sentinel or Cluster to achieve high availability.

The most direct way to list all keys in the Redis database is to use the KEYS* command, but it is recommended to use the SCAN command to traverse step by step in production environments. 1. The KEYS command is suitable for small or test environments, but may block services; 2. SCAN is an incremental iterator to avoid performance problems and is recommended for production environments; 3. The database can be switched through SELECT and the keys of different databases are checked one by one; 4. The production environment should also pay attention to key namespace management, regular export of key lists, and use monitoring tools to assist operations.

Yes,asinglechannelcansupportanunlimitednumberofsubscribersintheory,butreal-worldlimitsdependontheplatformandaccounttype.1.YouTubedoesnotimposeasubscribercapbutmayenforcecontentreviewsandviewerlimitsforlivestreamsonfreeaccounts.2.Telegramsupportsupto2
