패턴에 따른 모든 키를 가져올 수 있는 명령이다
keys *
keys user:*
와 같이 와일드카드 형태로 써줄 수 있다
그러나 모든 키를 순회하며 동작한다는 점에서 서버를 블로킹한다
즉, O(n)의 시간 복잡도를 가진다
따라서 production 환경에서 사용 불가하다
개발의 편의성을 위해 사용
keys를 통해 조회 시의 성능 문제를 해결하기 위한 대안으로
정해진 개수만큼 키들을 나눠서 가져오게 된다
따라서 서버를 블록하고 다른 작업들을 대기하게 하지만
호출의 중간에 다른 명령어를 실행할 수 있다
이때 중복 가능하다는 특성을 가진다
한꺼번에 키들을 불러오는 것이 아니기 때문에 스캔으로 불러오는 도중 키가 생성 혹은 이동되는 변경이 가능하다
따라서 스캔을 활용 시 중복 처리 로직을 추가해주는 것이 좋다
scan cursor [pattern] [count] [types]
cursor : 탐색의 시작점(0부터 시작해 응답으로 받은 다음 커서 번호를 다음 요청에 넣음)
pattern : 필터링 조건(와일드카드 지원)
count : 한번에 훑어보는 데이터의 양
이때 count는 한번에 반환하는 동일한 데이터의 양은 아님
예를 들어 해당 데이터 셋에서 탐색을 했을 때 해당하는 데이터가 없는 경우 반환하는 양은 0이지만 count는 이때 한번에 훑어보는 데이터의 양으로
별도의 값이다
types : 특정 타입(string, list ...)
exist는 get과 유사하지만 의도는 더 명확하다는 점에서 분리해 사용할 수 있다
또한 get은 string일때 실제 값까지 반환한다는 점에서
네트워크 상에서 exist가 더 이점을 지닌다
exist는 정수값(0 또는 1)이고 get은 데이터를 보내므로 데이터 크기에 따라 네트워크에서의 전송량과,
전송 후 역직렬화 비용이 커진다
또 string이 아닌 key는 get을 활용하는 것이 불가하다
exist는 그렇지 않다
exist user:1000 user:2000