반응형
async function selectQueryData() {
const start = new Date().toISOString(); // 시작 시각
console.log(`[${start}] Starting query...`);
// 실제 쿼리 실행
await new Promise(resolve => setTimeout(resolve, 500)); // 테스트용
const end = new Date().toISOString(); // 종료 시각
console.log(`[${end}] Query finished.`);
}
selectQueryData();
async function checkConnections() {
const [before] = await pool.execute('SHOW PROCESSLIST');
console.log('Before query:', before.length);
const rows = await executeQuery('SELECT * FROM your_table', []);
const [after] = await pool.execute('SHOW PROCESSLIST');
console.log('After query:', after.length);
}
커넥션 반환이 되어있는지 확인 법
async function executeQuery(query, params) {
const connection = await pool.getConnection(); // 커넥션 가져오기
console.log('Acquired Connection Thread ID:', connection.threadId); // Thread ID 출력
try {
const [rows] = await connection.execute(query, params); // 쿼리 실행
return rows;
} finally {
console.log('Releasing Connection Thread ID:', connection.threadId); // 반환 시 로그
connection.release(); // 커넥션 반환
}
}
async function checkConnections() {
// 쿼리 실행 전 프로세스 리스트 확인
const [before] = await pool.execute('SHOW PROCESSLIST');
console.log('Before query:', before.map(proc => proc.Id)); // 활성 Thread ID 출력
// 쿼리 실행
const rows = await executeQuery('SELECT * FROM your_table', []);
// 쿼리 실행 후 프로세스 리스트 확인
const [after] = await pool.execute('SHOW PROCESSLIST');
console.log('After query:', after.map(proc => proc.Id)); // 활성 Thread ID 출력
// Thread ID가 반환되었는지 확인
const usedThreadId = rows.threadId; // 사용한 Thread ID
const stillExists = after.some(proc => proc.Id === usedThreadId);
console.log(
stillExists
? `Thread ID ${usedThreadId} is still active!`
: `Thread ID ${usedThreadId} has been released!`
);
}
checkConnections();
이렇게 했는데 도저히 시간이 안된다 ..이러면
외부에서 200개의 데이터를 1초마다 동시에 받아서 이를 저장하고, 최신 200개 데이터를 스프링으로 매번 갱신하여 전달하는 것입니다. 이 경우, 데이터 저장 및 갱신을 빠르고 효율적으로 처리할 방법이 필요합니다.
1. 데이터 수신 및 저장
- 외부에서 200개의 데이터를 1초마다 받아서 저장하는 것이므로, 메모리 기반 캐시 시스템을 사용하여 데이터를 빠르게 처리하고 최신 200개만 유지하면 됩니다. Redis 같은 시스템을 사용하면 좋습니다.
2. 최신 200개 데이터 관리
- 최신 200개 데이터를 제한적으로 저장하려면, Redis의 리스트나 정렬된 셋(sorted set)을 사용하는 것이 매우 유용합니다.
- Redis는 리스트(List data type)을 사용하여 데이터를 FIFO 방식으로 저장하고, 가장 오래된 데이터를 자동으로 제거할 수 있습니다.
- 또는, 정렬된 셋(Sorted Set)을 이용하여 데이터를 순위별로 정렬하고 최신 데이터를 추출할 수 있습니다.
3. Redis 활용 예시
- 200개의 데이터를 **a_latest**와 같은 키로 최신 데이터를 관리하고, 매번 스프링에 전달할 수 있도록 합니다.
Redis 리스트 사용 예시 (최신 200개 데이터 유지)
- 1초마다 데이터를 받아서 Redis에 저장하고, 최신 200개만 유지하도록 처리합니다.
const redis = require('redis');
const client = redis.createClient();
// 1초마다 데이터를 받아서 Redis에 최신 200개 데이터 유지
async function handleDataAndUpdateRedis(data) {
// 데이터를 Redis 리스트에 추가 (최대 200개만 유지)
await client.lpush('a_latest', JSON.stringify(data)); // 최신 데이터 추가
// 리스트의 길이가 200개를 넘으면 가장 오래된 데이터 삭제
await client.ltrim('a_latest', 0, 199); // 앞의 200개만 남기기
}
// 최신 데이터 가져오기 (스프링에 전달)
async function getLatestFromRedis() {
const latestData = await client.lrange('a_latest', 0, 199); // 최신 200개 데이터 조회
return latestData.map(item => JSON.parse(item)); // JSON으로 변환
}
4. Redis Sorted Set 사용 예시 (타임스탬프 기반으로 데이터 정렬)
- Redis의 정렬된 셋을 사용하여 타임스탬프를 기반으로 데이터를 정렬하고, 최신 200개 데이터를 쉽게 관리할 수 있습니다.
// 1초마다 데이터를 받아서 Redis Sorted Set에 최신 200개 데이터 유지
async function handleDataAndUpdateSortedSet(data) {
const timestamp = Date.now(); // 현재 타임스탬프
// 데이터를 Sorted Set에 추가 (타임스탬프를 score로 사용)
await client.zadd('a_latest_sorted', timestamp, JSON.stringify(data));
// Sorted Set에서 가장 오래된 데이터 삭제 (최대 200개)
await client.zremrangebyrank('a_latest_sorted', 0, -201); // 가장 오래된 200개 제거
}
// 최신 데이터 가져오기 (스프링에 전달)
async function getLatestFromSortedSet() {
const latestData = await client.zrevrange('a_latest_sorted', 0, 199); // 최신 200개 데이터 조회
return latestData.map(item => JSON.parse(item)); // JSON으로 변환
}
5. 데이터 처리 흐름
- 1초마다 200개의 데이터를 받기: 외부에서 데이터를 WebSocket이나 HTTP POST 등으로 받습니다.
- Redis에 데이터 저장: 받은 데이터를 Redis에 빠르게 저장하고, 최신 200개 데이터만 유지하도록 합니다.
- 스프링으로 데이터 전달: 1초마다 Redis에서 최신 200개 데이터를 가져와 스프링 백엔드로 전달합니다.
6. 장점
- 속도: Redis는 메모리 기반으로 매우 빠른 읽기/쓰기 속도를 제공합니다.
- 최신 데이터 유지: Redis 리스트나 정렬된 셋을 사용하여 최신 200개 데이터만을 자동으로 관리할 수 있습니다.
- 스프링과의 연동: Redis에서 최신 데이터를 추출하고 이를 스프링 백엔드로 실시간 전달할 수 있습니다.
결론
- Redis를 사용하여 최신 200개 데이터를 관리하는 것이 매우 효율적입니다.
- 리스트 또는 정렬된 셋을 활용하여 최신 데이터를 쉽게 추출하고, 1초마다 스프링에 정확히 최신 200개 데이터를 전달할 수 있습니다.
- 배치 방식이나 디스크 기반 DB를 사용하지 않고, 메모리 기반 Redis를 사용하면 실시간 처리 성능을 극대화할 수 있습니다.
반응형