redis zadd 명령어를 알아봅시다.

REDIS 2023. 1. 8. 00:08

 특정 시간에 인증을 몇 회 했는지 어떻게 기록하면 좋을까요?

 


 결론부터 말하면 redis의 sorted set을 이용하는 것도 좋은 선택이 될 수 있습니다. 저는 zadd 명령어를 이용해서 관리하는 방법을 보여줄 겁니다. 기본형은 zadd key score member입니다. key와 연관되는 sorted set에 점수가 score이고, 멤버가 member인 정보를 넣습니다.

 

 어떤 정보를 넣으면 좋을까요? 어떤 시간에 발생한 이벤트의 경우, timestamp를 넣습니다.timestamp를 메타 데이터에 저장하면 언제 이벤트가 발생했는지 알 수 있습니다. 제가 모의 코딩테스트에 절찬리에 출제했던 문제도 비슷한 방식으로 접근하면 됩니다. redis에서 sorted set은 1차 정렬 기준을 score, 2차 정렬 기준을 member로 잡습니다. 이 부분은 밑에서 후술하겠습니다.

 

 먼저, time을 입력해 봅시다. 1673101393이 있는데요. 현재 시각이 기준 시각으로부터 몇 초나 경과되었는지를 보여줍니다. 기준 시각으로부터 1673101393초만큼 지났네요. 이 시점에 chokw를 인증하려고 시도했다는 정보를 어떻게 추가해야 할까요? 언제 시도했는지를 추가해야 하니 timestamp가 매우 중요한 정보가 됩니다.

 

 zadd chokw_verify 1673101393 1673101393은, chokw_verify라는 set에, score가 1673101393이고 member가 1673101393을 넣는 작업을 합니다.

 

 다음에, time을 찍어보겠습니다. 1673101465가 나왔는데요. 이 때 chokw에 대해서 verify가 시도되었다고 해 봅시다. 그러면 score를 1673101465로, member를 1673101465로 하면 됩니다. chokw_verify에요. 이제 chokw_verify에 연관된 sorted set에는 두 개의 정보가 저장됩니다.

 

 1673101465에 이벤트가 발생했다. 1673101393에 이벤트가 발생했다. 이걸 가지고 특정 시간동안 얼마나 많은 시도가 있었는지를 알 수 있을까요?

 

 현재 시각은 1673101717입니다. 이 시각으로부터 300초 전부터 몇 번이나 인증 시도 이벤트가 발생했는지 봅시다. 우리는 sorted set에 score로 저장했으므로, zrangebyscore로 조건을 줘서 검색해 주면 됩니다.

 

 1673101717의 300초 전은 1673101417입니다. 이 시각보다 크면 되므로, 1673101417부터 inf까지 검색합니다. WITHSCORES를 주면, 스코어까지 같이 나오는데요. 1개의 정보가 검색되었음을 볼 수 있습니다. 이를 토대로, 1673101417 ~ 1673101717까지 1번의 인증 시도가 있었음을 알 수 있습니다.

 

 

 현재 시각이 1673101861입니다. 최근 300초 동안 몇 번의 인증시도가 있었는지 어떻게 보면 될까요? 1673101561부터 inf까지 보면 됩니다.

 

 

 zrangebyscore chokw_verify 1673101561 inf를 입력하면, empty array가 나옵니다. 해당 시간대에는 시도가 없었기 때문입니다.

 

 

 이미 있는 member에 대해 score를 새로 갱신하면 어떻게 될까요? 예를 들어 member 1673101393이 있었는데요. 이 멤버의 score를 1673101893으로 설정했습니다.

 

 확인해 보면, 1673101393 member의 점수가 1673101893으로 업데이트 되었음을 알 수 있습니다. 디폴트로 이미 있는 멤버에 대해서 스코어를 덮어 씌우기 때문입니다. 다른 동작을 원하면, 문서에 있는 options 단락을 참고하시면 됩니다.

 


 이제, 같은 점수이지만 member가 다른 것을 넣어봅시다. b와 a는 score가 같지만, member가 다릅니다.

 

 출력될 때, score가 같았으므로, member 순으로 정렬되었음을 볼 수 있습니다. 이는 문서의 Elements with same scores를 보면 알 수 있습니다.