
# 通过openAPI实现自定义周期备份
游戏业务经常选用GeminiDB Redis存储玩家数据，兼顾低时延和数据持久化特性。本文介绍通过openAPI编写手动备份脚本，实现自定义备份周期（例如每2小时或4小时备份一次）。
GeminiDB Redis备份时仅需在存储层打秒级快照并上传OBS保存，因此速度极快，且对业务影响小（优于自建开源Redis的全量dump方案）。
#### 注意事项
- 触发备份时，可能会产生轻微的瞬时抖动。
- 备份上传时，需占用一定CPU和带宽资源。
- 手动备份默认永久保存，控制台支持批量删除不需要的备份。
 
#### 操作步骤
1. pom文件导入样例，详情请参考[SDK官方文档](https://console.huaweicloud.com/apiexplorer/#/sdkcenter/GaussDBforNoSQL?lang=Java)：
   
   ```
   <dependency>
       <groupId>com.huaweicloud.sdk</groupId>
       <artifactId>huaweicloud-sdk-gaussdbfornosql</artifactId>
       <version>3.1.92</version>
   </dependency>
   ```
   认证信息配置auth：
   ```
   // 配置认证信息
           // 可通过环境变量等方式配置认证信息。
           ICredential auth = new BasicCredentials()
                   .withAk(System.getenv("HUAWEICLOUD_SDK_AK"))
                   .withSk(System.getenv("HUAWEICLOUD_SDK_SK"));
   ```
   withAk、withSk是使用账号下的AK、SK，获取方式可以参考[获取AK/SK](https://support.huaweicloud.com/devg-apisign/api-sign-provide-aksk.html)。
   
   
2. 获取GeminiDB服务客户端：
   
   ```
   // 创建服务客户端
           VpcClient client = VpcClient.newBuilder()
                   .withCredential(auth)
                   .withRegion(VpcRegion.valueOf("cn-north-4"))
                   .build();
   ```
   此示例是以Vpc服务为参考，需要将VpcClient 修改为：GaussDBforNoSQLClient。
   - withCredential：认证信息，传入第1步中构造的信息auth即可。
   
   - withRegion：将VpcRegion替换成GaussDBforNoSQLRegion即可，Region信息可以在[APIE](https://console.huaweicloud.com/apiexplorer/#/openapi/GaussDBforNoSQL/doc?api=CreateBack)上查看获取。
     ![](https://support.huaweicloud.com/redisug-nosql/zh-cn_image_0000001863248598.png "点击放大")
     
   
   
   
   
3. 构造请求： 
   ```
   // 创建请求 
    ListVpcsRequest request = new ListVpcsRequest();
   ```
   将ListVpcsRequest修改为CreateBackRequest，其中CreateBackRequest需要设置如下两个值，具体方法请参考[创建手动备份](https://support.huaweicloud.com/api-nosql/create_manual_backup.html)：
   - request.setInstanceId("instanceId"); // 需要创建备份的实例ID。
   
   - request.setBody(backupRequestBody); // 备份信息：备份名称和备份描述。
   
   
   
   
4. 调用API：
   
   ```
   ListVpcsResponse response = client.listVpcs(request);
   System.out.println(response.toString());
   ```
   使用[2]获取的服务客户端调用创建备份接口：
   ```
   CreateBackResponse backResponse = client.createBack(request);
   ```
   
   
5. 加入定时触发逻辑（也可以自己选择其他类似方式实现）。 
   需用户编写一个定时任务方法，将[1]至[4]的代码放入该方法中。在方法上使用@Scheduled(cron = "0 0/1 \* \* \* ?")进行配置调度时间策略，如下为具体参考配置示例：
   Cron表达式：\[秒\] \[分\] \[小时\] \[日\] \[月\] \[周\] \[年\]。
   - \*表示所有值。在分钟里表示每一分钟触发，在小时、日期、月份等里面表示每一小时、每一日、每一月。
   
   - ？表示不指定值。表示不关心当前位置设置的值，比如不关心是周几，则周的位置填写？。
   
   - -表示区间。小时设置为10-12，表示10点、11点、12点均会触发。
   
   - ,表示多个值。 小时设置成10,12，表示10点和12点会触发。
   
   - /表示递增触发。 5/15表示从第5秒开始，每隔15秒触发。
   
   - L表示最后，只能出现在日和周两个域。L前加数据，表示在该数据的最后一个触发，如6L表示在最后一个星期五触发。
   
   - W表示离指定日期最近的工作日触发。15W表示离该月15号最近的工作日触发。
   
   - #表示每月的第几个周几。6#3表示该月的第三个周五触发。
   
   
   配置方式举例：
   - "0 15 10 ? \* \*"表示每天上午10:15触发。
   
   - "0 15 10 \* \* ? 2024"表示2024年的每天上午10:15触发。
   
   - "0 0/5 14 \* \* ?"表示在每天下午2点到下午2:55期间的每5分钟触发。
   
   - "0 0/5 14,18 \* \* ?"表示在每天下午2点到下午2:55期间和下午6点到下午6:55期间的每5分钟触发。
   
   - "0 0 \*/6 \* \* \*"表示每6个小时触发。
   
   
   
   
 
