[redis] keys 대신 scan

nosql 2015. 7. 2. 15:45


redis의 keys는 모든 키의 내용을 출력하는 커맨드인데, 키가 많아지면, 키를 찾는데 시간 소요가 커질 수 있다.

이 때, redis 의 one thread 정책 특성 때문에 다른 작업을 하지 못하게 된다. 따라서 문제가 될 소지가 많은 명령어이다.


KEYS 설명에 Warning에 잘 설명되어 있다. 

http://redis.io/commands/KEYS



Warning: consider KEYS as a command that should only be used in production environments with extreme care. 

It may ruin performance when it is executed against large databases. 

This command is intended for debugging and special operations, such as changing your keyspace layout. 

Don't use KEYS in your regular application code. 

If you're looking for a way to find keys in a subset of your keyspace, consider using SCAN or sets.






따라서, key를 보려면 SCAN (http://redis.io/commands/scan이나 set를 쓰라고 되어 있다.

SCAN 명령어는 page 개념과 커서 개념이 들어가 있으니. 이에 맞는 옵션을 사용하면 된다.


간단하게 키를 검색하는 명령어는 "scan 0"이고, 페이지 단위로 넘겨야 한다. 



page 개념은 count로 되어 있다 .count는 디폴트가 10이라서, 큰 데이터가 redis에 있다면 적당하기 크게 하면 된다.


그리고, wildcard(*)를 사용하여 일치하는 redis key를 찾을 수 있다. 커서는 scan 커맨드 뒤에 붙여 사용하도록 되어 있다. 

아래 처럼 scan 명령어를 사용하면 괜찮을 것이다. 


100개씩 queue:noti 키가 있는지를 체크한다. 그 다음에 확인하려면 커서의 값인 8010을 scan 뒤에 붙여 검색하면 된다. 

127.0.0.1:6379> scan 0 match queue:noti count 100
1) "8010"
...

127.0.0.1:6379> scan 8010 match queue:noti count 100
1) "8010"

...




다른 scan도 비슷하게 사용할 수 있다. 

  • SCAN iterates the set of keys in the currently selected Redis database.
  • SSCAN iterates elements of Sets types.
  • HSCAN iterates fields of Hash types and their associated values.
  • ZSCAN iterates elements of Sorted Set types and their associated scores.





개발 redis에서 keys 대신 아래 처럼 count와 패턴을 사용하는 것이 좋다.

> scan 0 count 100000000

> scan 0 match *na count 100000000



실제 구현 내용은 아래 블로그를 참조할 수 있다.


https://charsyam.wordpress.com/2015/01/15/%EC%9E%85-%EA%B0%9C%EB%B0%9C-redis-scan%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%A0%EA%B9%8C/


https://charsyam.wordpress.com/2015/01/18/%EC%9E%85%EA%B0%9C%EB%B0%9C-redis-scan%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%A0%EA%B9%8C-part-2/


https://charsyam.wordpress.com/2015/01/20/%EC%9E%85%EA%B0%9C%EB%B0%9C-redis-scan%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%A0%EA%B9%8C-part-3%EA%B2%B0/

Posted by '김용환'
,