Redis에서 키 수 인쇄


164

Redis에서 키 수를 인쇄하는 방법이 있습니까?

나는 알고있어

keys *

그러나 그것은 약간 무거운 무게로 보입니다. -Redis가 핵심 가치 저장소라는 점을 감안할 때 이것이 유일한 방법 일 것입니다. 하지만 난 여전히 라인을 따라 뭔가를보고 싶습니다

count keys *

4
COUNT에 대한 풀 요청이 있지만 거부되었습니다. github.com/antirez/redis/pull/32 antirez도 KEYS에 댓글을 달았습니다
Alex

그들이 O (n) 일 것이므로 그것을 지원하지 않았는지 궁금합니다.
andy 부팅

답변:


199

서버에 대한 정보 및 통계를 리턴하는 INFO 명령을 실행할 수 있습니다. 예제 출력 은 여기 를 참조 하십시오 .

mVChr의 의견에서 언급했듯이 info keyspaceredis-cli에서 직접 사용할 수 있습니다 .


1
redis-cli INFO Keyspace | grep ^db
Hackaholic

164

DBSIZE 키 수를 반환하고 구문 분석하기가 더 쉽습니다.

단점 : 키가 만료 된 경우 여전히 계산 될 수 있습니다.

http://redis.io/commands/dbsize


3
이 예에서는 KEYS *만료 된 키를 제거합니다. 또한 Redis 일부 만료 된 키를 적극적으로 제거 할 수 있지만 반드시 모든 키를 제거 할 수는 없습니다.
seppo0010

45

경고 : 프로덕션 머신에서는 이것을 실행하지 마십시오.

Linux 박스에서 :

redis-cli KEYS "*" | wc -l

참고 : 아래 주석에서 언급했듯이 이것은 O (N) 작업이므로 키가 많은 대형 DB에서는이를 사용하지 않아야합니다. 소규모 배포의 경우 문제가 없습니다.


3
매우 편리하며 키를 필터링 할 수도 있습니다.
Nick Farina

25
그것은 O (n) 연산입니다. O (1)에서 이것을 수행하는 방법이 있습니까?
Zoozy

21
프로덕션 환경에서는 큰 데이터베이스에서 사용하지 마십시오. KEYS Command
Mantas

4
누군가가 이것을 읽고, 언젠가 그것을 생각하지 않고 생산 상자 에서이 작업을 수행 한 다음 가장자리로 밀어 넣습니다 ... 아마 이미 일어났습니다.
Stu Thompson

2
프로덕션 서버가 아닌 서버에서만 사용하는 면책 조항이 있어야합니다. 그렇지 않으면 사용해야 redis.io/commands/SCAN을
whitfin




4

dbsize() 총 키 수를 반환합니다.

무작위로 키를 샘플링 한 다음 패턴과 일치하는 부분을 확인하여 주어진 패턴과 일치하는 키 수를 빠르게 추정 할 수 있습니다.

파이썬의 예; 로 시작하는 모든 키 계산 prefix_:

import redis
r = redis.StrictRedis(host = 'localhost', port=6379)
iter=1000
print 'Approximately', r.dbsize() * float(sum([r.randomkey().startswith('prefix_') for i in xrange(iter)])) / iter

심지어 iter=100아직에 비해 매우 빠르고, 내 경우에 유리한 견적을 제공합니다 keys prefix_.

개선 된 방법은 모든 요청에서 1000 개의 키를 샘플링하지만 총 개수를 유지하여 두 요청을 2000으로 나누고 세 요청을 3000으로 나눕니다. 따라서 응용 프로그램이 총 수에 관심이있는 경우 일치하는 키를 자주 사용하면 실제 값에 가까워 질 때마다


1

Redis 2.6 이후에는 INFO 명령의 결과가 섹션별로 분할됩니다. "키 스페이스"섹션에는 몇 개의 키가 있는지 알려주는 "키"및 "만료 된 키"필드가 있습니다.


4
이것은 정확하지 않습니다. 다음은이 섹션의 샘플 출력입니다. # Keyspace db0 : keys = 366, expires = 366 여기서 'keys'는 총 키 수를 나타내고 'expires'는 만료가 설정된 키가 없음을 나타냅니다. 기본적으로 ttl 세트가 있으며 만료되지 않은 것이 아니라 만료되도록 설정되어 있음을 의미합니다.
s1d

-1
eval "local count = redis.call('scan', 0, 'match', 'key:*:key', 'count', 10000) if count ~= 0 then return #count[2] end " 0

eval "local count = redis.call('sscan', 'key.key:all', 0, 'match', '*', 'count', 1000000) if count ~= 0 then return #count[2] end " 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.