View a markdown version of this page

데이터베이스 쿼리 결과 캐싱 - Amazon ElastiCache

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

데이터베이스 쿼리 결과 캐싱

데이터베이스 쿼리 지연 시간을 줄이기 위한 일반적인 패턴은 쿼리 캐싱입니다. 애플리케이션은 데이터베이스 쿼리와 연결된 결과를 캐시에 쿼리하여 캐시된 결과를 반환함으로써 쿼리 캐싱을 구현합니다. 캐시된 결과를 찾을 수 없는 경우 데이터베이스에서 쿼리가 실행되고 결과가 캐시에 채워진 다음 쿼리를 시작하는 애플리케이션으로 결과가 반환됩니다. 이후 데이터베이스 쿼리는 캐시에 남아 있는 한 캐시된 결과를 반환합니다.

쿼리 캐싱을 사용해야 하는 경우

ElastiCache를 사용한 쿼리 캐싱은 다음 워크로드 유형에 가장 효과적입니다.

  • 자주 변경되지 않는 데이터로 동일한 쿼리가 반복적으로 실행되는 읽기 중심 애플리케이션입니다.

  • 인덱싱되지 않은 조회, 집계 또는 쿼리 실행 시간이 긴 다중 테이블 조인과 같은 비용이 많이 드는 쿼리입니다.

  • ElastiCache로 읽기를 오프로드하면 데이터베이스 CPU 압력이 줄어들고 전체 처리량이 향상되는 동시성이 높은 시나리오입니다.

쿼리 캐싱은 강력한 일관성이 필요한 쿼리 또는 read-after-write 일관성이 필요한 다중 문 트랜잭션 내의 쿼리에는 권장되지 않습니다.

AWS 고급 JDBC 래퍼 사용

애플리케이션이 JDBC 드라이버를 사용하여 관계형 데이터베이스를 쿼리하는 경우 AWS 고급 JDBC 래퍼원격 쿼리 캐시 플러그인을 사용하여 쿼리 캐싱을 구현할 수 있습니다. 플러그인은 선택한 SQL 쿼리 결과 세트를 ElastiCache에 자동으로 캐싱하여 향후 쿼리를 위해 데이터베이스 대신 캐시에서 결과 세트를 반환합니다. 쿼리 결과를 캐싱하면 애플리케이션 코드 변경을 최소화하면서 데이터베이스 로드를 줄이고 평균 쿼리 지연 시간을 줄일 수 있습니다.

쿼리 캐싱이 플러그인과 작동하는 방식

원격 쿼리 캐시 플러그인을 사용하면 PostgreSQL, MySQL 또는 MariaDB 데이터베이스를 쿼리하는 Java 애플리케이션이 ElastiCache에서 쿼리 결과를 자동으로 캐싱할 수 있습니다. 캐시 엔드포인트 정보로 플러그인을 구성하고 쿼리 힌트를 사용하여 코드에서 캐싱할 쿼리를 지정합니다. 플러그인이 힌트가 있는 쿼리를 감지하면 캐시에서 쿼리 결과를 반환합니다(캐시 적중). 결과가 캐시에 없는 경우(캐시 누락) 플러그인은 데이터베이스에서 쿼리를 실행하고 결과를 캐시에 저장한 다음 다음에 쿼리를 실행할 때 캐시에서 결과를 제공할 수 있도록 결과를 애플리케이션에 반환합니다.

캐싱 힌트

각 쿼리에 힌트를 설정하여 캐시할 쿼리를 제어합니다. 주석 접두사를 사용하여 애플리케이션 코드의 쿼리 문자열에 직접 쿼리 힌트를 적용할 수 있습니다.

/* CACHE_PARAM(ttl=300s) */ SELECT * FROM my_table WHERE id = 42

여기서 ttl는 초 단위의 time-to-live입니다. 최대 절전 모드 및 Spring Boot와 같은 공통 프레임워크를 사용하여 준비된 문에서 쿼리 힌트를 설정할 수도 있습니다.

사전 조건

애플리케이션에서 원격 쿼리 캐시 플러그인을 사용하려면 다음 종속성과 함께 ElastiCache for Valkey 또는 Redis OSS 캐시(서버리스 및 노드 기반 모두 지원됨)가 필요합니다.

예: 플러그인을 사용하여 쿼리 캐싱

다음 예제에서는 플러그인을 활성화하고 ElastiCache for Valkey 서버리스 캐시를 사용하여 300초(5분) 동안 쿼리 결과를 캐시하는 방법을 보여줍니다.

import java.sql.*; import java.util.Properties; public class QueryCacheExample { public static void main(String[] args) throws SQLException { Properties props = new Properties(); props.setProperty("user", "myuser"); props.setProperty("password", "mypassword"); // Enable the remote query cache plugin props.setProperty("wrapperPlugins", "remoteQueryCache"); // Point to your ElastiCache endpoint props.setProperty("cacheEndpointAddrRw", "my-cache.serverless.use1.cache.amazonaws.com:6379"); Connection conn = DriverManager.getConnection( "jdbc:aws-wrapper:postgresql://my-database.cluster-abc123.us-east-1.rds.amazonaws.com:5432/mydb", props ); Statement stmt = conn.createStatement(); // The SQL comment hint tells the plugin to cache this query for 300 seconds ResultSet rs = stmt.executeQuery( "/* CACHE_PARAM(ttl=300s) */ SELECT product_name, price FROM products WHERE category = 'electronics'" ); while (rs.next()) { System.out.println(rs.getString("product_name") + ": $" + rs.getBigDecimal("price")); } rs.close(); stmt.close(); conn.close(); } }

이 쿼리가 처음 실행되면 데이터베이스에서 결과가 반환되고 ElastiCache에 캐시됩니다. 향후 300초 동안 해당 쿼리의 후속 실행은 캐시에서 직접 제공됩니다.

원격 쿼리 캐시 플러그인 설명서에서 플러그인 구성에 대한 더 광범위한 예제와 자세한 정보를 찾을 수 있습니다.