sql >> データベース >  >> NoSQL >> Redis

redisの特定のパターンに一致しないキーを取得する方法は?

    重要: 常にSCANを使用してください (の代わりに )KEYS

    Redisのパターンマッチングは機能的に多少制限されています(stringmatchlenの実装を参照してください) util.c)で、ATMを求めるものを提供しません。そうは言っても、次の可能なルートを検討してください。

    1. stringmatchlenを拡張します 要件に合わせて、PRとして提出することもできます。
    2. 何をしようとしているのかを考えてください。キーのサブセットをフェッチすることは、インデックスを作成しない限り常に非効率になります。代わりに、すべての非ユーザーキーの名前を追跡することを検討してください(Redisセットなど)。
    3. >
    4. キースペース全体をスキャンしてネガティブパターンと照合することに固執している場合、それを実現する1つの方法は、Luaの魔法を少し使用することです。

    次のデータセットとスクリプトを検討してください。

    127.0.0.1:6379> dbsize
    (integer) 0
    127.0.0.1:6379> set user:1 1
    OK
    127.0.0.1:6379> set use:the:force luke
    OK
    127.0.0.1:6379> set non:user a
    OK
    

    Lua(これをscanregex.luaとして保存します ):

    local re = ARGV[1]
    local nt = ARGV[2]
    
    local cur = 0
    local rep = {}
    local tmp
    
    if not re then
      re = ".*"
    end
    
    repeat
      tmp = redis.call("SCAN", cur, "MATCH", "*")
      cur = tonumber(tmp[1])
      if tmp[2] then
        for k, v in pairs(tmp[2]) do
          local fi = v:find(re) 
          if (fi and not nt) or (not fi and nt) then
            rep[#rep+1] = v
          end
        end
      end
    until cur == 0
    return rep
    

    出力-1回目は通常のマッチング、2回目は補数:

    [email protected]:~$ redis-cli --eval scanregex.lua , "^user"
    1) "user:1"
    [email protected]:~$ redis-cli --eval scanregex.lua , "^user" 1
    1) "use:the:force"
    2) "non:user"
    


    1. Queryable<T>をIMongoQueryに変換し直します

    2. MongoDB $ isNumber

    3. 既存のコレクションに新しいバリデーターを追加する

    4. 大規模なETAを使用したセロリタスクのスケジューリング