복붙노트

[REDIS] 방법 레디 스에서 특정 패턴과 일치하지 않는 키를 얻으려면?

REDIS

방법 레디 스에서 특정 패턴과 일치하지 않는 키를 얻으려면?

레디 스에서 키 사용자 * 사용자로 시작하는 모든 키를 인쇄합니다. 예를 들면 :

keys user*
1) "user2"
2) "user1"

지금, 나는 사용자로 시작하지 않는 모든 키를 인쇄 할. 내가 어떻게 할 수 있을까?

해결법

  1. ==============================

    1.중요 : 항상 대신 (악) 키 SCAN을 사용

    중요 : 항상 대신 (악) 키 SCAN을 사용

    레디 스 '패턴 매칭 (util.c에 stringmatchlen의 구현을 참조) 다소 기능적으로 제한하고 당신이 ATM을 추구하는 것을 제공하지 않습니다. 말했다 즉, 다음과 같은 가능한 경로를 고려하십시오

    다음 데이터 세트 및 스크립트를 고려 :

    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
    

    (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
    

    출력 - 처음으로 정규 일치, 2 시간 보수 :

    foo@bar:~$ redis-cli --eval scanregex.lua , "^user"
    1) "user:1"
    foo@bar:~$ redis-cli --eval scanregex.lua , "^user" 1
    1) "use:the:force"
    2) "non:user"
    
  2. ==============================

    2.Gopall @Karthikeyan 당신은 위의 의견에 못을 박았다이 나에게 시간의 무리를 저장. 감사!

    Gopall @Karthikeyan 당신은 위의 의견에 못을 박았다이 나에게 시간의 무리를 저장. 감사!

    다음은 당신이 원하는 것을 얻기 위해 다양한 조합으로 사용하는 방법은 다음과 같습니다

    redis.domain.com:6379[1]> set "hello" "foo"
    OK
    redis.domain.com:6379[1]> set "hillo" "bar"
    OK
    redis.domain.com:6379[1]> set "user" "baz"
    OK
    redis.domain.com:6379[1]> set "zillo" "bash"
    OK
    redis.domain.com:6379[1]> scan 0
    1) "0"
    2) 1) "zillo"
       2) "hello"
       3) "user"
       4) "hillo"
    redis.domain.com:6379[1]> scan 0 match "[^u]*"
    1) "0"
    2) 1) "zillo"
       2) "hello"
       3) "hillo"
    redis.domain.com:6379[1]> scan 0 match "[^u^z]*"
    1) "0"
    2) 1) "hello"
       2) "hillo"
    redis.domain.com:6379[1]> scan 0 match "h[^i]*"
    1) "0"
    2) 1) "hello"
    
  3. ==============================

    3.레디 스 키 문서에 따르면, 명령이 지원하는 스타일 패턴이 아닌 정규 표현식 glob에.

    레디 스 키 문서에 따르면, 명령이 지원하는 스타일 패턴이 아닌 정규 표현식 glob에.

    이 문서를 보면, 당신은 볼 것이다 "!" 문자는 정규 표현식에 대한 반대와 같은 특수 없습니다.

    여기에 내가 내 자신의 DB에 실행하는 간단한 테스트는 다음과 같습니다

    redis 127.0.0.1:6379> set a 0
    OK
    redis 127.0.0.1:6379> set b 1
    OK
    redis 127.0.0.1:6379> keys *
    1) "a"
    2) "b"
    redis 127.0.0.1:6379> keys !a   
    (empty list or set)                       // I expected "b" here
    redis 127.0.0.1:6379> keys !b
    (empty list or set)                       // I expected "a" here
    redis 127.0.0.1:6379> keys [!b]
    1) "b"
    redis 127.0.0.1:6379> keys [b]
    1) "b"
    redis 127.0.0.1:6379> keys [ab]
    1) "a"
    2) "b"
    redis 127.0.0.1:6379> keys ![b]
    (empty list or set)
    

    난 그냥 당신이 달성하려고하는 것을 생각하지 않는다 그래서 키가 명령을 통해 가능하다.

    그것은 당신의 전체 레디 스 데이터베이스를 잠금으로 게다가, 키 명령은 프로덕션 환경에 매우 적합하지 않습니다.

    나는, 스캔 명령으로 모든 키를 얻는 것이 좋습니다 로컬로 저장 한 다음 LUA를 사용하여 제거 할 것

  4. from https://stackoverflow.com/questions/29942541/how-to-get-keys-which-does-not-match-a-particular-pattern-in-redis by cc-by-sa and MIT license