redis

Redis scan count: How to force SCAN to return all keys matching a pattern?


I am trying to find out values stored in a list of keys which match a pattern from redis. I tried using SCAN so that later on i can use MGET to get all the values, The problem is:

SCAN 0 MATCH "foo:bar:*" COUNT 1000

does not return any value whereas

SCAN 0 MATCH "foo:bar:*" COUNT 10000

returns the desired keys. How do i force SCAN to look through all the existing keys? Do I have to look into lua for this?


Solution

  • With the code below you will scan the 1000 first object from cursor 0

    SCAN 0 MATCH "foo:bar:*" COUNT 1000 
    

    In result, you will get a new cursor to recall

    SCAN YOUR_NEW_CURSOR MATCH "foo:bar:*" COUNT 1000
    

    To scan 1000 next object. Then when you increase COUNT from 1000 to 10000 and retrieve data you scan more keys then in your case match more keys.

    To scan the entire list you need to recall SCAN until the cursor give in response return zero (i.e entire scan)

    Use INFO command to get your amount of keys like

    db0:keys=YOUR_AMOUNT_OF_KEYS,expires=0,avg_ttl=0

    Then call

    SCAN 0 MATCH "foo:bar:*" COUNT YOUR_AMOUNT_OF_KEYS