실시간 데이터 처리의 필요성이 날로 증가하고 있는 요즘, 많은 개발자들이 Redis를 선택하고 있습니다. Redis는 고성능 인메모리 데이터 구조 저장소로, 빠른 읽기 및 쓰기 속도를 자랑합니다. 이번 글에서는 Redis를 활용하여 실시간 데이터 처리를 구현한 경험담과 그로 인해 성능이 어떻게 변화했는지를 공유하고자 합니다.
Redis 선택 이유
Redis를 선택한 주된 이유는 다음과 같습니다:
- 속도: Redis는 메모리에서 데이터를 처리하기 때문에 디스크 기반 데이터베이스보다 훨씬 빠릅니다.
- 데이터 구조: 다양한 데이터 구조(리스트, 셋, 해시 등)를 지원하여 유연한 데이터 모델링이 가능합니다.
- 간편한 확장성: 클러스터링을 통해 수평 확장이 가능하여 대량의 트래픽을 효율적으로 처리할 수 있습니다.
- Pub/Sub 기능: 실시간 메시징 기능을 통해 데이터 변경 사항을 즉시 반영할 수 있습니다.
- Redis 설치 및 설정
- Node.js와 Redis 연동
- 성능 비교
실시간 데이터 처리 구현
우리 팀은 Redis를 사용하여 실시간 사용자 활동 로그를 수집하고 분석하는 시스템을 구축했습니다. 이 시스템은 사용자 행동을 빠르게 분석하여 맞춤형 서비스를 제공하는 데에 중점을 두고 있습니다.
우선 Redis를 Docker를 사용하여 설치하였습니다. 다음 명령어로 Redis 서버를 쉽게 실행할 수 있습니다.
docker run --name redis-server -d -p 6379:6379 redis
Node.js로 간단한 Redis 클라이언트를 구현하였습니다. redis 패키지를 사용하여 Redis에 데이터 저장 및 조회를 처리합니다.
const redis = require('redis');
const client = redis.createClient();
client.on('error', (err) => {
console.error('Redis error: ', err);
});
// 사용자 활동 로그 저장
function logUserActivity(userId, activity) {
const timestamp = new Date().toISOString();
const logEntry = JSON.stringify({ userId, activity, timestamp });
client.lpush('user_activity', logEntry, (err, res) => {
if (err) {
console.error('Error logging activity: ', err);
} else {
console.log('Activity logged successfully.');
}
});
}
// 사용자 활동 로그 조회
function getUserActivities(callback) {
client.lrange('user_activity', 0, -1, (err, activities) => {
if (err) {
console.error('Error retrieving activities: ', err);
} else {
callback(activities);
}
});
}
Redis를 도입하기 전, 사용자 활동 로그를 MySQL에 저장하고 분석하는 시스템을 운영하였습니다. 이 경우, 데이터 저장 및 조회 속도는 평균적으로 300ms 이상 걸렸습니다. 그러나 Redis를 도입한 이후, 데이터 저장 속도는 5ms로 줄어들었고, 데이터 조회 속도도 10ms로 개선되었습니다.
성능 측정 예제
다음은 Redis와 MySQL의 성능 차이를 측정하기 위한 간단한 코드입니다.
const mysql = require('mysql');
const startTime = Date.now();
// MySQL 데이터베이스에서 데이터 저장
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test_db'
});
connection.connect();
function saveUserActivityMySQL(userId, activity) {
const sql = 'INSERT INTO user_activity (user_id, activity, timestamp) VALUES (?, ?, ?)';
connection.query(sql, [userId, activity, new Date()], (error) => {
if (error) throw error;
const endTime = Date.now();
console.log(MySQL data saved in ${endTime - startTime} ms);
});
}
// Redis 데이터 저장
function saveUserActivityRedis(userId, activity) {
const logEntry = JSON.stringify({ userId, activity, timestamp: new Date() });
client.lpush('user_activity', logEntry, (err) => {
if (err) throw err;
const endTime = Date.now();
console.log(Redis data saved in ${endTime - startTime} ms);
});
}
// 테스트 실행
saveUserActivityMySQL('user123', 'page_view');
saveUserActivityRedis('user123', 'page_view');
마무리
Redis를 도입한 이후, 실시간 데이터 처리 시스템의 성능이 크게 향상되었습니다. 사용자 활동 로그의 저장 및 조회 속도가 비약적으로 빨라졌고, 실시간 분석이 가능해져 사용자 경험을 극대화할 수 있었습니다. 데이터베이스 성능이 중요해지는 시대, Redis는 그 선택지 중 하나로서 강력한 도구가 될 것입니다. 앞으로도 Redis를 활용한 다양한 최적화 기법을 탐구할 예정입니다.