Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

Redis 캐싱으로 글로벌 데이터베이스 성능 가속화

소프트웨어 애플리케이션의 가치는 고객의 요구 사항을 충족할 수 있는 만큼만 가치가 있습니다. 고객의 요구를 고려할 때 가장 먼저 직면하는 요구 사항은 적용 속도와 데이터 신뢰성입니다. 그러나 애플리케이션이 전 세계적으로 성장하고 확장됨에 따라 SQL 데이터베이스는 쿼리 볼륨 증가, 대기 시간 증가, 지리적으로 분산된 사용자 기반으로 인해 성능 병목 현상이 발생하는 경우가 많습니다.

애플리케이션이 커질 때 이러한 문제를 해결하기 위해 캐싱은 반복되는 쿼리에 대한 기본 데이터베이스의 로드를 줄이고 사용자가 쿼리를 제출할 때 대기 시간을 줄이는 첫 번째 솔루션 중 하나입니다. 캐시에 관해 이야기할 때 우리 모두는 동일한 도구를 떠올립니다. 그렇죠? 네, 바로 Redis입니다. Redis는 로드를 줄이고 애플리케이션 속도를 높이기 위해 데이터를 캐싱하는 완벽한 도구입니다. Upstash는 또한 전 세계적으로 분산된 Redis 복제를 제공하므로 일반 캐시보다 애플리케이션 속도가 훨씬 빨라집니다.

이 블로그에서는 Global Redis를 SQL 데이터베이스와 통합할 때의 기술적 이점을 살펴보고, 지연 시간 및 확장성에 미치는 영향을 논의하고, PostgreSQL 및 MySQL과 함께 Global Redis를 사용하는 실습 예제를 제공합니다.

캐싱의 이점

먼저 캐싱을 사용해야 하는 이유를 살펴보겠습니다.

이 블로그에서 언급하고 싶은 캐싱의 두 가지 주요 이점은 데이터베이스 로드 감소와 사용자 대기 시간 감소입니다.

데이터베이스 부하 줄이기

SQL 데이터베이스는 구조화된 데이터와 복잡한 쿼리를 관리하는 데 탁월하지만 부하가 심한 경우 병목 현상이 발생할 수 있습니다. 제품 세부 정보, 사용자 프로필, 자주 액세스하는 설정 등 동일한 데이터에 대한 대량의 반복 쿼리는 상당한 CPU 및 I/O 리소스를 소비합니다. 이러한 결과를 캐싱함으로써 데이터베이스에 도달하는 쿼리 수가 크게 줄어들어 데이터베이스가 트랜잭션 처리 및 업데이트와 같은 보다 중요한 작업에 집중할 수 있습니다.

예:

  • 캐싱 없음:웹사이트의 인기 기능은 매일 수백만 개의 동일한 데이터베이스 쿼리를 생성하여 다른 작업의 성능을 저하시킵니다.
  • 캐싱 사용:자주 액세스하는 쿼리 결과는 Redis와 같은 고속 캐시에 저장되어 데이터베이스 쿼리 속도를 90% 이상 줄입니다.

지연 시간 줄이기

데이터베이스 부하를 줄이는 것은 데이터 안정성을 보장하기 위한 시스템 상태였습니다. 캐싱은 또한 사용자 요청 및 쿼리에 소요되는 시간을 단축합니다.

애플리케이션이 데이터베이스에 동일한 데이터를 반복적으로 쿼리하면 데이터 검색에 항상 오랜 시간이 걸립니다. 특히 이러한 쿼리가 데이터베이스에 큰 부하를 생성하는 경우 이러한 모든 지연이 더욱 증가할 수 있습니다. 이는 실시간 데이터 액세스가 필요하거나 높은 쿼리 볼륨을 처리해야 하는 애플리케이션의 경우 특히 문제가 되며, 작은 지연이라도 성능에 큰 영향을 미칠 수 있습니다.

캐싱은 자주 액세스하는 데이터를 메모리에 저장하여 데이터베이스를 쿼리하는 것보다 검색하는 속도가 훨씬 빠르므로 이 문제를 해결합니다. 캐싱은 반복되는 요청에 대한 데이터베이스 쿼리에 대한 종속성을 줄여 네트워크 이동을 최소화하고 복잡한 쿼리 실행에 따른 계산 오버헤드를 방지합니다. 결과적으로 응답 시간이 획기적으로 향상되어 애플리케이션이 로드가 많거나 분산된 환경에서도 더 빠르고 일관된 성능을 제공할 수 있습니다.

일반적인 캐싱 전략

애플리케이션 성능 최적화에 사용되는 두 가지 주요 캐싱 전략인 캐시 배제를 이해하는 것도 중요합니다. 및 연속 기입 . 각 접근 방식에는 애플리케이션 요구 사항에 따라 사용 사례와 장단점이 있습니다.

캐시 배제 가장 일반적인 캐싱 기술입니다. 이 기술에서 애플리케이션은 먼저 캐시에서 데이터를 확인합니다. 데이터가 캐시에 없으면(캐시 누락) 데이터베이스에서 데이터를 검색하여 나중에 사용할 수 있도록 캐시에 씁니다.

다음은 캐시 배제 작동 방식을 보여주는 간단한 다이어그램입니다. 이 블로그를 방문하기 전에 이미 어딘가에서 본 적이 있을 것입니다.

Redis 캐싱으로 글로벌 데이터베이스 성능 가속화

이 캐싱의 장점은 캐시 크기가 최적화되고 사용자가 필요할 때 캐시 데이터가 다시 로드된다는 것입니다. 반면, TTL이 끝나면 캐시를 정리한 후 데이터를 사용할 수 없다는 단점이 있습니다. 이때 사용자가 해당 데이터를 요청하면 캐시가 다시 로드됩니다. 이 경우 해당 사용자는 쿼리가 완료될 때까지 기다려야 합니다. 하지만 물론 다음 요청에서는 캐시에서 데이터를 다시 가져올 수 있습니다.

연속 기입 전략에 따라 데이터베이스에 대한 모든 쓰기 작업은 즉시 캐시에도 기록됩니다. 이렇게 하면 캐시가 데이터베이스의 최신 데이터로 항상 최신 상태를 유지하게 됩니다.

다음은 Write-through 캐싱에 대한 간단한 다이어그램입니다.

Redis 캐싱으로 글로벌 데이터베이스 성능 가속화

이 전략은 캐시와 데이터베이스 간의 데이터 일관성을 보장하며 사용자의 요청을 기다리지 않고 데이터를 이미 사용할 수 있기 때문에 어떤 요청도 더 높은 대기 시간을 경험하지 않습니다. 그러나 단점은 필요하지 않더라도 캐시에 모든 데이터가 포함되어 있다는 것입니다. 게다가 데이터가 캐시에도 기록되므로 모든 쓰기 작업에 지연 시간이 발생합니다.

글로벌 Redis란 무엇입니까? 글로벌 Redis의 이점

이제 SQL 데이터베이스의 성능을 더욱 향상시킬 수 있는 방법을 살펴보겠습니다.

대기 시간의 또 다른 원인은 데이터베이스의 위치입니다. 대부분의 경우 기본 데이터베이스는 특정 지역에 위치합니다. 하지만 데이터 저장소와의 거리로 인한 지연을 최소화하려면 가장 가까운 위치에서 데이터에 도달할 수 있어야 합니다.

이 문제는 Upstash에서 제공하는 전 세계적으로 분산된 Redis를 사용하면 예방할 수 있습니다.

Global Redis는 여러 지리적 위치에 걸쳐 데이터를 복제하는 분산 캐싱 솔루션으로, 전 세계에 분산된 애플리케이션에 대한 짧은 지연 시간 액세스를 보장합니다.

글로벌 Redis를 생성하는 방법을 빠르게 살펴보겠습니다. 먼저 Upstash 콘솔에 로그인하세요.

로그인 후 여기에서 Redis 데이터베이스를 생성할 수 있습니다. Upstash는 읽기 전용 복제본을 찾을 수 있는 여러 위치를 제공합니다.

Redis 캐싱으로 글로벌 데이터베이스 성능 가속화

읽기 위치를 선택하면 계획을 선택하고 마지막으로 Redis 데이터베이스를 생성할 수 있습니다. 그게 다야!

콘솔에서는 데이터베이스 생성 후에도 지역을 추가/제거할 수 있습니다.

Redis 캐싱으로 글로벌 데이터베이스 성능 가속화

글로벌 Redis 데이터베이스는 전 세계적으로 분산된 애플리케이션과 엣지에서 실행되는 애플리케이션에서 주로 사용됩니다.

전 세계적으로 분산된 애플리케이션을 위한 짧은 지연 시간

전역적으로 분산된 시스템에서는 사용자와 중앙 데이터베이스 또는 캐시 사이의 물리적 거리로 인해 지연 시간이 병목 현상을 일으키는 경우가 많습니다. Global Redis는 지리적으로 분산된 여러 노드에 데이터를 복제하여 이 문제를 해결합니다.

사용자가 데이터를 요청하면 가장 가까운 캐시 노드가 요청을 처리하므로 네트워크 이동 시간이 대폭 단축됩니다. 이러한 현지화된 액세스는 사용자의 위치에 관계없이 더 빠른 응답 시간과 일관된 사용자 경험을 보장합니다.

예를 들어 사용자는 도쿄에 있지만 데이터베이스는 더블린에 있는 경우 거리 때문에 사용자에 대한 응답이 지연됩니다. 유럽에 Upstash Redis의 읽기 전용 복제본이 있는 경우 요청은 가장 가까운 읽기 전용 복제본(이 경우 유럽에 있는 읽기 전용 복제본)으로 라우팅될 수 있습니다.

에지 런타임(예:Cloudflare Workers)에 대한 짧은 대기 시간 데이터

엣지 런타임은 최종 사용자와 가까운 네트워크 엣지에서 코드를 실행하도록 설계된 환경입니다. 엣지 런타임은 전 세계 여러 엣지 위치에 애플리케이션 로직을 배포합니다. 이 아키텍처는 사용자와 요청 실행 사이의 물리적 거리를 최소화하여 대기 시간을 크게 줄이고 성능을 향상시킵니다.

엣지 런타임은 사용자에게 더 가까운 계산을 제공하지만 사용자별 정보, 세션 토큰 또는 구성 검색과 같은 대부분의 작업을 위해 여전히 데이터에 액세스해야 합니다. 캐싱 계층이 없으면 각 요청은 여전히 ​​중앙 데이터베이스로 왕복해야 하므로 대기 시간 이점이 상당 부분 무효화됩니다. Global Redis는 자주 사용되는 데이터를 엣지에 복제하여 짧은 지연 시간의 액세스를 보장하므로 중요한 역할을 합니다.

예제 코드 1:Node.js를 사용한 PostgreSQL

글로벌 Redis를 사용한 캐싱은 완벽합니다. 이제 Upstash Redis와 Postgresql 데이터베이스를 사용하여 캐시 배제 전략을 구현하는 코드 샘플을 살펴보겠습니다.

먼저 데이터 저장소에 연결하는 데 사용할 SDK를 설치해야 합니다.

npm install pg upstash/redis

종속성을 설치하고 나면 데이터 저장소인 Upstash Redis 및 Postgres에 연결할 수 있습니다.

const { Redis } = require('@upstash/redis'); // Upstash Redis SDK
const { Client } = require('pg');
 
const redis = new Redis({
 url: <UPSTASH_REDIS_REST_URL>,
 token: <UPSTASH_REDIS_REST_TOKEN>,
})
 
const client = new Client({
 user: 'username',
 password: 'password',
 host: 'host',
 port: 'port_number',
 database: 'database_name',
});
 
client.connect();

이제 데이터 액세스 계층에 함수를 작성해 보겠습니다. 이 기능은 필요에 따라 수정할 수 있습니다.

userId로 웹사이트에 사용자 정보를 표시하고 싶다고 가정해 보겠습니다. 이 경우 userId를 매개변수로 가져오는 함수가 있어야 합니다.

async function getUserData(userId) {
 // Check cache first
 const cachedData = await redis.get(userId);
 if (cachedData) {
 console.log('Cache hit');
 return JSON.parse(cachedData);
 }
 // Fallback to database
 console.log('Cache miss');
 const query = 'SELECT * FROM users WHERE id = $1';
 const { rows } = await client.query(query, [userId]);
 await redis.set(userId, JSON.stringify(rows), { EX: 300 }); // Cache for 5 minutes
 return rows;
}

여기 있습니다! 이제 이 기능은 먼저 요청자의 지역과 가장 가까운 Redis 데이터베이스에서 사용 가능한 사용자 정보를 확인합니다. 사용할 수 없는 경우 Postgresql 데이터베이스에서 요청된 데이터를 쿼리하고 반환된 데이터를 Upstash Redis 기본 지역에 씁니다. 기본 지역에 기록된 데이터는 모든 읽기 전용 복제본에 자동으로 복사됩니다.

예제 코드 2:Python을 사용한 MYSQL

이제 또 다른 예를 살펴보겠습니다. 이번에도 동일한 캐시 구현을 하겠지만, 이번에는 메인 데이터베이스가 MYSQL이 될 것입니다. 또한 이 함수를 Python으로 작성하여 Python 기반 애플리케이션에서 어떻게 작동하는지 살펴보겠습니다.

평소와 마찬가지로 먼저 데이터베이스 연결에 사용할 종속성을 다운로드합니다.

pip install upstash-redis upstash-redis

이제 클라이언트를 초기화하고 연결할 수 있습니다.

import upstash_redis
import mysql.connector
import json
 
# Initialize Upstash Redis client
redis_client = upstash_redis.Redis(
 url='<your-upstash-redis-url>',
 token='<your-upstash-token>'
)
 
# Initialize MySQL client
db = mysql.connector.connect(
 host="<your-mysql-host>",
 user="<your-mysql-user>",
 password="<your-mysql-password>",
 database="<your-database-name>"
)
 
cursor = db.cursor(dictionary=True)

연결이 준비되었습니다. 이제 이전 섹션에서 구현한 유사한 기능을 구현하겠습니다.

def get_user_data(userId):
 # Check the cache for the data
 cache_data = redis_client.get(key)
 if cache_data:
 print("Cache hit")
 return json.loads(cache_data)
 
 # If cache miss, query the MySQL database
 print("Cache miss")
 cursor.execute("SELECT * FROM users WHERE key = %s", (userId))
 result = cursor.fetchone()
 if result:
 # Store the data in the cache with a TTL of 1 hour
 redis_client.set(key, json.dumps(result), ex=3600)
 return result

결론

Global Redis를 아키텍처에 통합하면 특히 전 세계적으로 분산된 환경에서 SQL 기반 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 짧은 지연 시간의 액세스, 감소된 데이터베이스 로드, 엣지 런타임과의 호환성을 통해 Global Redis는 SQL 데이터베이스를 사용하는 애플리케이션의 성능 문제를 해결할 수 있습니다.

이 블로그 게시물에서는 글로벌 Redis를 사용한 캐싱의 이점을 살펴보고 몇 가지 예를 살펴보았습니다. 이는 필요에 따라 더 확장할 수 있는 기본적인 예일 뿐입니다.

이 블로그가 여러분이 글로벌 Redis의 강력한 기능을 활용하기 위한 좋은 시작이 되기를 바랍니다.