가끔 앱이나 웹을 보다보면 N명이 이 화면을 보고 있습니다! 라는 문구가 있는 것을 볼 수 있다.
필자도 간단하게 이 기능을 구현해볼까 한다.
1. 첫 번째로 개발자의 기본인 구글 검색부터 시작해보았다.
서버를 띄우고 있는 Tomcat이나 Apache로 서버에 몇 명이 들어와 있는지 확인하는 방법이 가장 대중적으로 사용하고 있는 것 같았다. 하지만 필자는 서버의 전체 사람이 아닌 한 화면에 들어와있는 사용자를 카운팅하는 것이 목적이기 때문에 간단하게 넘어가기로 한다.
2. 두 번째로 생각해본 것은 웹소켓이었다.
사실상 웹소켓을 이용해 세션을 이어간다면 그게 진정한 동시접속자가 아닐까라는 생각에서 시작하였다.
하지만.. 이 조그만 기능때문에 양방향 통신을 이어준다? 이건 너무 큰 부하이다.. 정확하지만 효율성이 떨어진다
( 그리고 사용자가 많아보여야 좋지 않을까..? 읍읍)
3. 마지막 방법이 redis를 사용하는 방법이었다.
redis에는 SORTED SETS이라는 기능이 있다. 리스트와 개념은 비슷한데 야무진 놈이라 도입해보기로 했다.
import Redis = require('ioredis');
// 지금 시간부터 5분 전까지의 시간을 계산하여 count 조회
public static getListByScoreRedisData: Promise<number | null> (key: string, score: number) {
const lastTime = score - 300000;
// 미리 연결해둔 redis에 연결
const redis = Redis.getRoRedis();
return redis.zcount(key, lastTime, score);
}
// 5분이 지난 시간들은 삭제해준다.
public static removeListByScoreRedisData: Promise<void | number> (key: string, score: number) {
const lastTime = score - 300000;
// 미리 연결해둔 redis에 연결
const redis = Redis.getRedis();
return redis.zremrangebyscore(key, 0, lastTime);
}
// 유저가 들어오면 redis에 저장시켜준다.
public static setListRedisData: Promise<string | number> (key: string, score: number, member: string) {
// 미리 연결해둔 redis에 연결
const redis = Redis.getRedis();
return redis.zadd(key, score, member);
}
RESULT
{
count: 5
}
다음에는 소켓을 이용해 보다 정확하게 사용자 수를 카운트하는 것을 공부해봐야겠다!