[REDIS] 방법 레디 스에서 특정 패턴과 일치하지 않는 키를 얻으려면?
REDIS방법 레디 스에서 특정 패턴과 일치하지 않는 키를 얻으려면?
레디 스에서 키 사용자 * 사용자로 시작하는 모든 키를 인쇄합니다. 예를 들면 :
keys user*
1) "user2"
2) "user1"
지금, 나는 사용자로 시작하지 않는 모든 키를 인쇄 할. 내가 어떻게 할 수 있을까?
해결법
-
==============================
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.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.레디 스 키 문서에 따르면, 명령이 지원하는 스타일 패턴이 아닌 정규 표현식 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를 사용하여 제거 할 것
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
'REDIS' 카테고리의 다른 글
[REDIS] 어떻게 레디 스 서버를 중지 할 수 있습니다? (0) | 2019.12.31 |
---|---|
[REDIS] 레디 스에서 파이프 라인을 사용할 때 왜 이렇게 10 만 개 레코드로 둔화되고? (0) | 2019.12.31 |
[REDIS] 레디 스 : 설정에서 키 값 쌍으로 설정 시간 제한 (0) | 2019.12.31 |
[REDIS] 레디 스 읽을 수없는 저장 악센트 (0) | 2019.12.31 |
[REDIS] 이니셜 라이저에서 cache_store 설정 (0) | 2019.12.31 |