

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 缓存数据库查询结果
<a name="caching-database-query-results"></a>

减少数据库查询延迟的一种常见模式是查询缓存。应用程序通过在缓存中查询与数据库查询关联的结果来实现查询缓存，如果这些结果已被缓存，则返回这些结果。如果未找到缓存的结果，则会在数据库上执行查询，将结果填充到缓存中，然后将结果返回给启动查询的应用程序。随后的数据库查询将返回缓存的结果，前提是这些结果仍保留在缓存中。

## 何时使用查询缓存
<a name="caching-database-query-results-when-to-use"></a>

使用 ElastiCache 查询缓存对以下工作负载类型最有效：
+ Read-heavy 使用不经常更改的数据重复执行相同查询的@@ **应用程序**。
+ **昂贵的查询**，例如非索引查找、聚合或查询执行时间较长的多表联接。
+ High-concurrency 将读取卸载到 ElastiCache 可以减轻数据库 CPU 压力并提高整体吞吐量的@@ **场景**。

对于需要强一致性的查询，或需要先写后读一致性的多语句事务内部的查询，不建议使用查询缓存。

## 使用 AWS 高级 JDBC 封装器
<a name="caching-database-query-results-jdbc-wrapper"></a>

如果您的应用程序使用 JDBC 驱动程序来查询关系数据库，则可以使用[AWS 高级 J](https://github.com/aws/aws-advanced-jdbc-wrapper) DBC 包装器中的[远程查询缓存插件](https://github.com/aws/aws-advanced-jdbc-wrapper/blob/main/docs/using-the-jdbc-driver/using-plugins/UsingTheRemoteQueryCachePlugin.md)来实现查询缓存。该插件会自动将选定的 SQL 查询结果集缓存在中ElastiCache，从缓存中返回结果集，而不是从数据库中返回结果集，以备将来的查询之用。缓存查询结果可以减少数据库负载，降低平均查询延迟，只需最少的应用程序代码更改。

## 查询缓存如何与插件配合使用
<a name="caching-database-query-results-how-it-works"></a>

远程查询缓存插件使查询 PostgreSQL、MySQL 或 MariaDB 数据库的 Java 应用程序可以轻松地自动缓存查询结果。ElastiCache您可以使用缓存端点信息配置插件，并使用查询提示指明要缓存代码中的哪些查询。当插件检测到有提示的查询时，它会从缓存中返回查询结果（如果存在缓存命中）。如果结果不在缓存中（缓存失误），则插件会在数据库上执行查询，将结果存储在缓存中，然后将结果返回到您的应用程序，这样下次执行查询时就可以从缓存中提供结果。

## 缓存提示
<a name="caching-database-query-results-hints"></a>

您可以通过在每个查询上设置提示来控制要缓存哪些查询。您可以将查询提示直接应用于应用程序代码中带有注释前缀的查询字符串：

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

以秒`ttl`为单位的存活时间在哪里。您还可以使用 Hibernate 和 Spring Boot 等常用框架在准备好的语句中设置查询提示。

## 先决条件
<a name="caching-database-query-results-prerequisites"></a>

要在应用程序中使用远程查询缓存插件，你需要一个 ElastiCache for Valkey 或 Redis OSS 缓存（支持无服务器和基于节点的缓存）以及以下依赖项：
+ [AWS 高级 JDBC Wrapper](https://github.com/aws/aws-advanced-jdbc-wrapper) 版本 3.3.0 或更高版本。
+ [Apache 共享资源池](https://commons.apache.org/proper/commons-pool/)版本 2.11.1 或更高版本。
+ [Valkey Glide](https://glide.valkey.io/) 版本 2.3.0 或更高版本。

## 示例：使用插件缓存查询
<a name="caching-database-query-results-example"></a>

以下示例说明如何启用插件并使用 for Valkey 无服务器缓存将查询结果缓存 300 秒（5 分钟）： ElastiCache 

```
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 秒内，该查询的后续执行将直接从缓存中提供。

## 相关资源
<a name="caching-database-query-results-related"></a>

您可以在[远程查询缓存插件文档](https://github.com/aws/aws-advanced-jdbc-wrapper/blob/main/docs/using-the-jdbc-driver/using-plugins/UsingTheRemoteQueryCachePlugin.md)中找到有关插件配置的更广泛的示例和详细信息。