IT story

패턴과 일치하는 키 수

hot-time 2020. 12. 28. 22:03
반응형

패턴과 일치하는 키 수


일치하는 패턴이있는 모든 키의 수를 어떻게 찾을 수 있습니까?

예를 들어, 두 개의 키 abc:random-text-1abc:random-text-2. 여기서 일반적인 패턴은 abc:입니다. 그래서 여기서 카운트는 2입니다.

redis에서 어떻게 할 수 있습니까?


면책 조항 저는이 오래된 답변이 수백만 개의 키를 사용하는 프로덕션 시스템을 손상시키지 않았기를 바랍니다. 어떤 이유로 든 프로덕션에서 여전히 redis의 일치하는 키를 계산하려면 일치 패턴으로 스캔을 사용하는 것이 좋습니다 .

Redis 클라이언트로 KEYS로 검색하면 일치하는 모든 키의 번호 목록이 표시됩니다.

예 :

KEYS abc:*

너에게 줄 것이다

1) abc:random-text-1
2) abc:random-text-2

또는 다음을 실행할 수 있습니다.

./redis-cli KEYS "abc:*" | wc -l

2출력으로 얻을 수 있습니다.


에서 여기 :

eval "return #redis.pcall('keys', 'abc:*')" 0

O (1)은 아니지만 적어도 서버 측에서 계산이 수행됩니다.


성능을 고려하여 사용하지 않는 것이 좋습니다. KEYS

경고 : KEYS는 극도의주의를 기울여 프로덕션 환경에서만 사용해야하는 명령으로 간주하십시오. 대용량 데이터베이스에 대해 실행하면 성능이 저하 될 수 있습니다. 이 명령은 키 스페이스 레이아웃 변경과 같은 특수 작업 및 디버깅을위한 것입니다. 일반 애플리케이션 코드에서 KEYS를 사용하지 마십시오. 키 스페이스의 하위 집합에서 키를 찾는 방법을 찾고 있다면 세트 사용을 고려하십시오.

redis 버전이 2.8.0 이상인 경우 scan 을 고려하는 것이 좋습니다 . 그러나 사용할 데이터 유형에 따라 다릅니다.

다음은 redis doc 의 간단한 예입니다 .

redis 127.0.0.1:6379> sadd myset 1 2 3 foo foobar feelsgood
(integer) 6
redis 127.0.0.1:6379> sscan myset 0 match f*
1) "0"
2) 1) "foo"
   2) "feelsgood"
   3) "foobar"

일회성 인 경우 x_maras에 설명 된대로 KEYS를 사용할 수 있지만 KEYS는 호출 될 때마다 전체 데이터베이스의 모든 키를 스캔하므로 코드에서 사용해서는 안됩니다.

자주 사용하고 싶다면 모든 키를 스캔하는 것이 항상 상당히 비효율적이기 때문에 작성한대로 정확하게 "좋은"방법은 없습니다 (SCAN을 사용하더라도 KEYS와 동일한 작업을 수행하기 때문입니다). 더 안전한 방식).

그러나 필요한 패턴을 미리 알고있는 경우 패턴과 일치하는 모든 키 집합을 유지할 수 있습니다.

SET abc:random-text-1 "blah"
SADD patterns:abc abc:randomtext-1

SET abc:random-text-2 "more blah"
SADD patterns:abc abc:randomtext-2

SCARD patterns:abc
// (integer) 2

SORT patterns:abc BY nosort GET *
// 1) "blah"
// 2) "more blah"

명령 줄에서 redis-cli --scan --pattern 'abc:*' | wc -l

참조 URL : https://stackoverflow.com/questions/20418529/count-of-keys-matching-a-pattern

반응형