이 문서는 Google Cloud Translation API를 사용해 자동 번역되었습니다.
어떤 문서는 원문을 읽는게 나을 수도 있습니다.
Redis는 고속 캐싱 기능을 제공하는 메모리 내 데이터 구조 저장소입니다. IT 개발에서 응용 프로그램과 데이터베이스 사이의 캐시 계층으로 널리 사용됩니다. Redis는 빠르고 확장 가능하며 광범위한 데이터 구조를 지원하기 때문에 캐싱에 탁월한 선택입니다.
이 기사에서는 Redis를 사용하여 고성능 캐시를 설계하기 위한 몇 가지 모범 사례에 대해 설명합니다. 확장 가능하고 효율적인 캐싱 아키텍처를 구축하는 데 도움이 되는 다양한 Redis 캐시 패턴과 사용 사례를 다룰 것입니다.
Redis 캐시 패턴을 자세히 알아보기 전에 캐싱의 기본 사항을 이해하는 것이 중요합니다. 캐시는 자주 액세스하는 데이터를 빠르게 액세스할 수 있도록 저장하는 임시 스토리지 계층입니다. 캐싱의 목적은 데이터베이스의 부하를 줄여 애플리케이션의 성능을 향상시키는 것입니다.
일반적인 캐싱 아키텍처에서 애플리케이션은 먼저 캐시를 확인하여 필요한 데이터를 사용할 수 있는지 확인합니다. 캐시에서 데이터를 사용할 수 없는 경우 애플리케이션은 데이터베이스에서 데이터를 검색하고 나중에 사용할 수 있도록 캐시에 저장합니다. 이 접근 방식은 데이터베이스 쿼리 수를 줄여서 애플리케이션의 전반적인 성능을 향상시킵니다.
Cache-Aside 패턴은 Redis에서 가장 일반적으로 사용되는 캐싱 패턴입니다. 이 패턴에서 애플리케이션은 먼저 캐시에서 필요한 데이터를 확인합니다. 캐시에서 데이터를 사용할 수 없는 경우 애플리케이션은 데이터베이스에서 데이터를 검색하고 나중에 사용할 수 있도록 캐시에 저장합니다.
다음은 Redis 및 Node.js를 사용하여 Cache-Aside 패턴을 구현하는 방법의 예입니다.
const redis = require("redis");
const client = redis.createClient();
function getProduct(productId, callback) {
client.get(`product:${productId}`, (err, data) => {
if (err) throw err;
if (data !== null) {
// data found in cache
callback(JSON.parse(data));
} else {
// data not found in cache, retrieve from database
db.getProduct(productId, (product) => {
// store product in cache
client.set(`product:${productId}`, JSON.stringify(product));
callback(product);
});
}
});
}
이 예에서 getProduct
함수는 먼저 지정된 productId
가 있는 제품의 Redis 캐시를 확인합니다. 제품이 캐시에서 발견되지 않으면 데이터베이스에서 검색하여 나중에 사용할 수 있도록 캐시에 저장합니다.
Write-Through 패턴이 있는 Cache-Aside는 Cache-Aside 패턴과 유사하지만 캐시가 업데이트될 때마다 데이터베이스를 업데이트하는 추가 단계가 있습니다.
이 패턴에서 애플리케이션은 먼저 캐시에서 필요한 데이터를 확인합니다. 캐시에서 데이터를 사용할 수 없는 경우 애플리케이션은 데이터베이스에서 데이터를 검색하고 나중에 사용할 수 있도록 캐시에 저장합니다. 애플리케이션이 데이터를 업데이트할 때 캐시와 데이터베이스를 동시에 업데이트합니다.
다음은 Redis 및 Node.js를 사용하여 Write-Through 패턴으로 Cache-Aside를 구현하는 방법의 예입니다.
const redis = require("redis");
const client = redis.createClient();
function updateProduct(productId, product, callback) {
// update product in the database
db.updateProduct(productId, product, () => {
// update product in the cache
client.set(`product:${productId}`, JSON.stringify(product), () => {
callback();
});
});
}
이 예에서 updateProduct
함수는 데이터베이스와 캐시의 제품을 동시에 업데이트합니다.
Read-Through 패턴이 있는 Cache-Aside는 Cache-Aside 패턴과 비슷하지만 데이터베이스가 업데이트될 때마다 캐시를 업데이트하는 추가 단계가 있습니다.
이 패턴에서 애플리케이션은 먼저 캐시에서 필요한 데이터를 확인합니다. 캐시에서 데이터를 사용할 수 없는 경우 애플리케이션은 데이터베이스에서 데이터를 검색하고 나중에 사용할 수 있도록 캐시에 저장합니다. 데이터가 데이터베이스에서 업데이트될 때마다 캐시에서도 업데이트됩니다.
다음은 Redis 및 Node.js를 사용하여 Read-Through 패턴으로 Cache-Aside를 구현하는 방법의 예입니다.
const redis = require("redis");
const client = redis.createClient();
function getProduct(productId, callback) {
client.get(`product:${productId}`, (err, data) => {
if (err) throw err;
if (data !== null) {
// data found in cache
callback(JSON.parse(data));
} else {
// data not found in cache, retrieve from database
db.getProduct(productId, (product) => {
// store product in cache
client.set(`product:${productId}`, JSON.stringify(product));
callback(product);
});
}
});
}
// listen to database updates and invalidate cache accordingly
db.on("productUpdated", (productId) => {
client.del(`product:${productId}`);
});
이 예에서 getProduct
함수는 먼저 지정된 productId
가 있는 제품의 Redis 캐시를 확인합니다. 제품이 캐시에서 발견되지 않으면 데이터베이스에서 검색하여 나중에 사용할 수 있도록 캐시에 저장합니다. 제품이 데이터베이스에서 업데이트될 때마다 해당 캐시 항목이 무효화됩니다.
Redis는 문자열, 해시, 목록, 세트 및 정렬된 세트를 포함한 광범위한 데이터 구조를 지원합니다. Redis 캐시를 설계할 때 저장된 데이터에 적합한 데이터 구조를 선택하는 것이 중요합니다.
예를 들어 고유한 사용자 ID 집합을 저장하는 경우 Redis 집합을 사용할 수 있습니다. 최근 이벤트 목록을 저장하는 경우 Redis 목록을 사용할 수 있습니다. 키-값 쌍을 저장하는 경우 Redis 해시를 사용할 수 있습니다.
Redis 캐시에 데이터를 저장할 때 데이터의 만료 시간을 설정하는 것은 필수입니다. 만료 시간을 설정하면 지정된 기간이 지나면 데이터가 자동으로 캐시에서 제거되어 오래된 데이터를 방지할 수 있습니다.
다음은 Redis 및 Node.js를 사용하여 만료 시간을 설정하는 방법의 예입니다.
client.set(`product:${productId}`, JSON.stringify(product), "EX", 3600);
이 예에서 제품 데이터는 3600초(1시간) 후에 캐시에서 자동으로 제거됩니다.
Redis 캐시 사용량을 정기적으로 모니터링하여 효율적으로 수행되는지 확인하는 것이 중요합니다. Redis는 INFO
명령 및 MONITOR
명령을 포함하여 캐시의 성능 및 사용량을 모니터링하는 데 사용할 수 있는 여러 모니터링 도구를 제공합니다.
애플리케이션이 커짐에 따라 증가한 로드를 처리하기 위해 Redis 캐시를 수평으로 확장해야 할 수 있습니다. Redis Cluster는 고가용성과 확장성을 제공하는 Redis의 분산 구현입니다.
Redis 클러스터는 여러 Redis 노드에 데이터를 분산하여 캐시가 많은 수의 요청을 처리할 수 있도록 합니다.
이 기사에서는 Redis를 사용하여 고성능 캐시를 설계하기 위한 몇 가지 모범 사례에 대해 논의했습니다. 확장 가능하고 효율적인 캐싱 아키텍처를 구축하는 데 도움이 되는 다양한 Redis 캐시 패턴과 사용 사례를 다루었습니다. 이러한 모범 사례를 따르면 애플리케이션의 성능을 향상시키고 데이터베이스의 부하를 줄이는 캐싱 계층을 설계할 수 있습니다.