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!