• judeng's avatar
    improve performance for scan command when matching pattern or data type (#12209) · 07ed0eaf
    judeng authored
    
    
    Optimized the performance of the SCAN command in a few ways:
    1. Move the key filtering (by MATCH pattern) in the scan callback,
      so as to avoid collecting them for later filtering.
    2. Reduce a many memory allocations and copying (use a reference
      to the original sds, instead of creating an robj, an excessive 2 mallocs
      and one string duplication)
    3. Compare TYPE filter directly (as integers), instead of inefficient string
      compare per key.
    4. fixed a small bug: when scan zset and hash types, maxiterations uses
      a more accurate number to avoid wrong double maxiterations.
    
    Changes **postponed** for a later version (8.0):
    1. Prepare to move the TYPE filtering to the scan callback as well. this was
      put on hold since it has side effects that can be considered a breaking
      change, which is that we will not attempt to do lazy expire (delete) a key
      that was filtered by not matching the TYPE (changing it would mean TYPE filter
      starts behaving the same as MATCH filter already does in that respect). 
    2. when the specified key TYPE filter is an unknown type, server will reply a error
      immediately instead of doing a full scan that comes back empty handed. 
    
    Benchmark result:
    For different scenarios, we obtained about 30% or more performance improvement.
    Co-authored-by: default avatarOran Agra <oran@redislabs.com>
    07ed0eaf
db.c 91.7 KB