

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

# 使用 Java 和客户端缓存获取 Secrets Manager 密钥值
<a name="retrieving-secrets_cache-java"></a>

在检索密钥时，您可以使用 Secrets Manager 基于 Java 的缓存组件来缓存密钥，以备将来使用。检索已缓存密钥比从 Secrets Manager 中检索密钥的速度要快。由于调用 Secrets Manager 需要付费 APIs，因此使用缓存可以降低成本。有关检索密钥的所有方法，请参阅 [获取密钥](retrieving-secrets.md)。

缓存策略为“最近最少使用 (LRU)”，因此当缓存必须丢弃某个密钥时，它会丢弃最近使用最少的密钥。原定设置下，缓存会每小时刷新一次秘密。您可以配置在缓存中[刷新密钥的频率](retrieving-secrets_cache-java-ref_SecretCacheConfiguration.md#retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-getCacheItemTTL)，也可以[挂钩到密钥检索中](retrieving-secrets_cache-java-ref_SecretCacheHook.md)以添加更多功能。

一旦释放缓存引用，缓存便不会进行强制垃圾回收。缓存实施不包括缓存失效。缓存实现侧重于缓存本身，而不是侧重加强安全性或以安全性为重点。如果您需要额外的安全性（例如加密缓存中的项目），请使用提供的接口和抽象方法。

要使用该组件，您必须满足以下条件：
+ Java 8 或更高版本的开发环境。请参阅 Oracle 网站上的 [Java SE 下载](https://www.oracle.com/technetwork/java/javase/downloads/index.html)。

要下载源代码，请参阅上的 S [ecrets Manager 基于 Java 的缓存客户端组件](https://github.com/aws/aws-secretsmanager-caching-java)。 GitHub

要将该组件添加到您的项目中，请在 Maven pom.xml 文件中包括以下依赖项。有关 Maven 的更多信息，请参阅 Apache Maven Project 网站上的[《入门指南》](https://maven.apache.org/guides/getting-started/index.html)。

```
<dependency>
  <groupId>com.amazonaws.secretsmanager</groupId>
  <artifactId>aws-secretsmanager-caching-java</artifactId>
  <version>1.0.2</version>
</dependency>
```

**所需权限：**
+ `secretsmanager:DescribeSecret`
+ `secretsmanager:GetSecretValue`

有关更多信息，请参阅 [权限参考](auth-and-access.md#reference_iam-permissions)。

**Topics**
+ [

# SecretCache
](retrieving-secrets_cache-java-ref_SecretCache.md)
+ [

# SecretCacheConfiguration
](retrieving-secrets_cache-java-ref_SecretCacheConfiguration.md)
+ [

# SecretCacheHook
](retrieving-secrets_cache-java-ref_SecretCacheHook.md)

**Example 检索密钥**  
以下代码示例显示了检索密钥字符串的 Lambda 函数。它遵循在函数处理程序之外实例化缓存的[最佳实践](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)，因此如果您再次调用该 Lambda 函数，它不会继续调用该 API。  

```
package com.amazonaws.secretsmanager.caching.examples;
    
    import com.amazonaws.services.lambda.runtime.Context;
    import com.amazonaws.services.lambda.runtime.RequestHandler;
    import com.amazonaws.services.lambda.runtime.LambdaLogger;
    
    import com.amazonaws.secretsmanager.caching.SecretCache;
    
    public class SampleClass implements RequestHandler<String, String> {
    
         private final SecretCache cache  = new SecretCache();
    
         @Override public String handleRequest(String secretId,  Context context) {
             final String secret  = cache.getSecretString(secretId);
    
            // Use the secret, return success;
    
        }
    }
```

# SecretCache
<a name="retrieving-secrets_cache-java-ref_SecretCache"></a>

适用于从 Secrets Manager 请求的密钥的内存中缓存。您使用 [getSecretString](#retrieving-secrets_cache-java-ref_SecretCache-methods-getSecretString) 或 [getSecretBinary](#retrieving-secrets_cache-java-ref_SecretCache-methods-getSecretBinary) 从缓存中检索密钥。您可以通过传入构造函数中的 [SecretCacheConfiguration](retrieving-secrets_cache-java-ref_SecretCacheConfiguration.md) 对象来配置缓存设置。

有关包括示例在内的更多信息，请参阅 [使用 Java 和客户端缓存获取 Secrets Manager 密钥值](retrieving-secrets_cache-java.md)。

## 构造函数
<a name="retrieving-secrets_cache-java-ref_SecretCache-constructors"></a>

`public SecretCache()`  
适用于 `SecretCache` 对象的默认构造函数。

`public SecretCache(AWSSecretsManagerClientBuilder builder)`  
使用 Secrets Manager 客户端（使用提供的 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClientBuilder.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClientBuilder.html) 创建）构造新缓存。使用此构造函数自定义 Secrets Manager 客户端，例如使用某一特定区域或端点。

`public SecretCache(AWSSecretsManager client)`  
请使用提供的 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html) 构造新密钥缓存。使用此构造函数自定义 Secrets Manager 客户端，例如使用某一特定区域或端点。

`public SecretCache(SecretCacheConfiguration config)`  
请使用提供的 `SecretCacheConfiguration` 构造新密钥缓存。

## 方法
<a name="retrieving-secrets_cache-java-ref_SecretCache-methods"></a>

### getSecretString
<a name="retrieving-secrets_cache-java-ref_SecretCache-methods-getSecretString"></a>

`public String getSecretString(final String secretId)`

从 Secrets Manager 中检索字符串密钥。返回 [https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true)。

### getSecretBinary
<a name="retrieving-secrets_cache-java-ref_SecretCache-methods-getSecretBinary"></a>

`public ByteBuffer getSecretBinary(final String secretId)`

从 Secrets Manager 中检索二进制密钥。返回 [https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html](https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html)。

### refreshNow
<a name="retrieving-secrets_cache-java-ref_SecretCache-methods-refreshNow"></a>

`public boolean refreshNow(final String secretId) throws InterruptedException`

强制刷新缓存。如果刷新完成没有错误，将返回 `true`，否则将返回 `false`。

### close
<a name="retrieving-secrets_cache-java-ref_SecretCache-methods-close"></a>

`public void close()`

关闭缓存。

# SecretCacheConfiguration
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration"></a>

适用于 [SecretCache](retrieving-secrets_cache-java-ref_SecretCache.md) 的缓存配置选项，例如最大缓存大小和已缓存密钥的生存时间 (TTL)。

## 构造函数
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_constructor"></a>

`public SecretCacheConfiguration`

适用于 `SecretCacheConfiguration` 对象的默认构造函数。

## 方法
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods"></a>

### getClient
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-getClient"></a>

`public AWSSecretsManager getClient()`

返回缓存从中检索密钥的 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html)。

### setClient
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-setClient"></a>

`public void setClient(AWSSecretsManager client)`

设置缓存从中检索密钥的 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html) 客户端。

### getCacheHook
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-getCacheHook"></a>

`public SecretCacheHook getCacheHook()`

返回用于挂钩缓存更新的 [SecretCacheHook](retrieving-secrets_cache-java-ref_SecretCacheHook.md) 接口。

### setCacheHook
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-setCacheHook"></a>

`public void setCacheHook(SecretCacheHook cacheHook)`

设置用于挂钩缓存更新的 [SecretCacheHook](retrieving-secrets_cache-java-ref_SecretCacheHook.md) 接口。

### getMaxCache大小
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-getMaxCacheSize"></a>

`public int getMaxCacheSize()`

返回最大缓存大小。默认值为 1024 个密钥。

### setMaxCache大小
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-setMaxCacheSize"></a>

`public void setMaxCacheSize(int maxCacheSize)`

设置最大缓存大小。默认值为 1024 个密钥。

### getCacheItemTTL
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-getCacheItemTTL"></a>

`public long getCacheItemTTL()`

返回已缓存项目的 TTL（以毫秒为单位）。当已缓存密钥超过此 TTL 时，缓存将从 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html) 中检索该密钥的新副本。默认值为 1 小时（以毫秒为单位）。

在 TTL 之后请求密钥时，缓存将同步刷新密钥。如果同步刷新失败，缓存将返回过时密钥。

### setCacheItemTTL
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-setCacheItemTTL"></a>

`public void setCacheItemTTL(long cacheItemTTL)`

为已缓存项目设置 TTL（以毫秒为单位）。当已缓存密钥超过此 TTL 时，缓存将从 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html) 中检索该密钥的新副本。默认值为 1 小时（以毫秒为单位）。

### getVersionStage
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-getVersionStage"></a>

`public String getVersionStage()`

返回您要缓存的密钥的版本。有关更多信息，请参阅[密钥版本](whats-in-a-secret.md#term_version)。默认值为 ` "AWSCURRENT"`。

### setVersionStage
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-setVersionStage"></a>

`public void setVersionStage(String versionStage)`

设置您要缓存的密钥的版本。有关更多信息，请参阅[密钥版本](whats-in-a-secret.md#term_version)。默认值为 `"AWSCURRENT"`。

### SecretCacheConfiguration 与客户一起
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-withClient"></a>

`public SecretCacheConfiguration withClient(AWSSecretsManager client)`

设置 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html) 以从中检索密钥。返回具有新设置的更新后的 `SecretCacheConfiguration` 对象。

### SecretCacheConfiguration withCacheHook
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-withCacheHook"></a>

`public SecretCacheConfiguration withCacheHook(SecretCacheHook cacheHook)`

设置用于挂钩内存中缓存的接口。返回具有新设置的更新后的 `SecretCacheConfiguration` 对象。

### SecretCacheConfiguration withMaxCache大小
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-withMaxCacheSize"></a>

`public SecretCacheConfiguration withMaxCacheSize(int maxCacheSize)`

设置最大缓存大小。返回具有新设置的更新后的 `SecretCacheConfiguration` 对象。

### SecretCacheConfiguration withCacheItemTTL
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-withCacheItemTTL"></a>

`public SecretCacheConfiguration withCacheItemTTL(long cacheItemTTL)`

为已缓存项目设置 TTL（以毫秒为单位）。当已缓存密钥超过此 TTL 时，缓存将从 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/AWSSecretsManagerClient.html) 中检索该密钥的新副本。默认值为 1 小时（以毫秒为单位）。返回具有新设置的更新后的 `SecretCacheConfiguration` 对象。

### SecretCacheConfiguration withVersionStage
<a name="retrieving-secrets_cache-java-ref_SecretCacheConfiguration_methods-withVersionStage"></a>

`public SecretCacheConfiguration withVersionStage(String versionStage)`

设置您要缓存的密钥的版本。有关更多信息，请参阅[密钥版本](whats-in-a-secret.md#term_version)。返回具有新设置的更新后的 `SecretCacheConfiguration` 对象。

# SecretCacheHook
<a name="retrieving-secrets_cache-java-ref_SecretCacheHook"></a>

用于挂钩到 [SecretCache](retrieving-secrets_cache-java-ref_SecretCache.md) 中以便对存储于缓存中的密钥执行操作的接口。

## put
<a name="retrieving-secrets_cache-java-ref_SecretCacheHook-put"></a>

`Object put(final Object o)`

准备对象以存储到缓存中。

返回要存储在缓存中的对象。

## 入
<a name="retrieving-secrets_cache-java-ref_SecretCacheHook-get"></a>

`Object get(final Object cachedObject)`

从已缓存对象派生对象。

返回要从缓存中返回的对象