Detailed explanation of the use of Scan command in Redis
The following column Redis Tutorial will introduce you to the detailed explanation of the use of the Scan command in Redis. I hope it will be helpful to friends in need!
There is a classic problem in Redis. In the case of a huge amount of data, it is similar to searching for a certain There are two ways to provide information about the Key of a rule.
The first is the keys command, which is simple and crude. Due to the single-threaded feature of Redis, the keys command is executed in a blocking manner, and keys is implemented in a traversal manner. The complexity is O(n). The more keys in the Redis library, the greater the search implementation cost and the longer the blocking time.
The second is the scan command, which implements key value search in a non-blocking manner. In most cases, it can replace the keys command and is more optional.
Write 100,000 keys below** *: Test data in value*** format (ps: If you use pipeline, 1w is one transaction, and each transaction is completed in seconds)
# -*- coding: utf-8 -*- # !/usr/bin/env python3 import redis import sys import datetimedef create_testdata(): r = redis.StrictRedis(host='***.***.***.***', port=***, db=0, password='***') counter = 0 with r.pipeline(transaction=False) as p: for i in range(0, 100000): p.set('key' + str(i), "value" + str(i)) counter = counter + 1 if (counter == 10000): p.execute() counter = 0 print("set by pipline loop") if __name__ == "__main__": create_testdata()
For example, here are the keys starting with key111?
If you use the keys command, execute keys key1111* to find out all at once.
Similarly, if you use the scan command, use scan 0 match key1111* count 20
The syntax of scan is :SCAN cursor [MATCH pattern] [COUNT count] The default COUNT value is 10.
The SCAN command is a cursor-based iterator. This means that every time the command is called, it needs to use the cursor returned by the previous call as the cursor parameter of the call, so as to continue the previous iteration process.
The scan 0 match key1111* count 20 command is used here to complete this query. Surprisingly, no results were found at the beginning. This depends on the principle of the scan command.
When scanning traverses keys, 0 represents the first time, key1111* represents matching according to the pattern starting with key1111, and the 20 in count 20 does not represent the output of qualified keys, but a dictionary that limits the server to a single traversal. Number of slots (approximately equal to).
So, what is slot data? Is this slot a slot in the Redis cluster? the answer is negative. In fact, the answer is already given in the picture above.
If the number of "dictionary slots" mentioned above is the slot in the cluster, and we know that the number of slots in the cluster is 16384, then after traversing 16384 slots, we will definitely be able to traverse all the key information.
It is clear from the above It can be seen clearly that when the number of traversed dictionary slots is 20,000, the cursor still has not completed the traversal results, so this dictionary slot is not equal to the concept of slot in the cluster.
After testing, when scanning, how many COUNT values can be traversed to completely match the key that meets the conditions is related to the number of keys of the specific object.
If the count exceeds the number of keys to scan, All keys that meet the conditions will be found at one time. For example, if the number of keys is 100,000, and 200,000 dictionary slots are traversed at one time, the result will definitely be completely traversed.
The scan instruction is a series of instructions. In addition to traversing all keys, it can also traverse the specified container collection.
zscan traverses the elements of the zset collection,
hscan traverses the elements of the hash dictionary, and
sscan traverses the elements of the set collection.
The first parameter of the SSCAN command, HSCAN command and ZSCAN command is always a database key (a specified key).
In addition, when using redis desktop manager, when refreshing a certain library, the console automatically refreshes the scan command continuously, so you know what it is doing
The above is the detailed content of Detailed explanation of the use of Scan command in Redis. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

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

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

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

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



How to clean all Redis data: Redis 2.8 and later: The FLUSHALL command deletes all key-value pairs. Redis 2.6 and earlier: Use the DEL command to delete keys one by one or use the Redis client to delete methods. Alternative: Restart the Redis service (use with caution), or use the Redis client (such as flushall() or flushdb()).

There are several mechanisms for communication between Redis instances: Pub/Sub: Publish/Sub mode, allowing efficient and low-latency messaging. Cluster mode: distributed deployment method, providing high availability and fault tolerance. Cross-instance Command: Allows commands to be sent directly to another instance, suitable for temporary operational or administrative purposes.

The steps for Redis cluster restart are as follows: Close and clear data and logs. Start the seed node. Create a new cluster. Add remaining nodes. Check cluster status.

Redis can be restarted in two ways: smooth restart and hard restart. Smooth restart without interrupting service, allowing the client to continue operations; hard restart terminates the process immediately, causing the client to disconnect and lose data. It is recommended to use a smooth restart in most cases, only if you need to fix serious errors or clean up your data.

This guide provides two ways to determine the current Redis version: use the INFO command to obtain the version number. Use the --version option to display the version number directly. The version number consists of the main version number, the secondary version number and the revision number, which respectively represent major version updates, functional enhancements and minor bug fixes.

Redis implements multi-threading by cleverly combining Reactor mode, thread pool and internal multi-threading mechanisms, thereby effectively utilizing multi-core CPUs, improving throughput, optimizing resource utilization, maintaining low latency and enhancing scalability, and meeting different load needs.

Redis transactions ensure atomicity, consistency, isolation, and persistence (ACID) properties, and operate as follows: Start a transaction: Use the MULTI command. Record command: Execute any number of Redis commands. Commit or rollback transactions: Use the EXEC command to commit the transaction, or the DISCARD command to rollback transactions. Commit: If there is no error, the EXEC command commits the transaction and all commands are applied atomically to the database. Rollback: If there is an error, the DISCARD command rolls back the transaction, all commands are discarded, and the database status remains unchanged.

By using the scan command, we can iterate over all keys in Redis by following the steps: The initial cursor is set to 0. Loops the SCAN 0 command to get the result set and a new cursor. The number of keys contained in each result set can be specified by the COUNT option. Use the new cursor as the first parameter of the SCAN command to get the next result set. Continue looping until the returned cursor is 0, indicating that there are no more results.
