
# 开发运维规范
本章节结合华为云数据库开发运维经验，从开发和运维角度为您提供GeminiDB Redis产品使用规范。根据这些建议，您可以有效评估以及改善业务系统稳定性。
#### 开发规范
在开发业务程序时需重点关注以下开发规范，避免因使用方式不当影响业务稳定。
表1GeminiDB Redis开发规范 
| 编号 | 开发规范                                                  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|
| 1  | 业务程序需具备合理的自动重连机制。                                     | 在规格变更、补丁升级、HA倒换、网络链路抖动或丢包等场景中，业务程序与数据库实例的连接可能出现短暂中断。业务程序应当支持自动重连。 说明： - 尽量避免使用Lettuce客户端，因为该客户端在请求多次超时后，不再发起自动重连。建议使用更稳定的Jedis客户端替换Lettuce客户端。  - 如果使用Lettuce客户端时，请确认客户端版本和自动重连配置满足业务要求，并在连接中断、请求超时、规格变更、补丁升级、HA倒换等场景下验证自动重连行为。                                                                                                                                                    |
| 2  | 业务程序需使用连接池并配置足够连接数。                                   | 为避免并发激增时程序获取不到连接，建议业务程序使用连接池，并配置合理的连接池参数。客户端的连接池推荐配置请参考[客户端连接池参数配置](https://support.huaweicloud.com/redisug-nosql/nosql_03_0802.html)。                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 3  | 针对部分重要操作，业务程序需要具备合理的命令重试机制。                           | 在连接中断或请求超时等场景，业务程序请求可能会短时内执行失败。因此，针对部分重要操作需要设计业务容错机制，使用合理的命令重试间隔和次数，确保重要数据写入或修改成功。                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 4  | 使用正确的高可用连接地址，避免单点故障场景影响业务。                            | 业务程序内网连接数据库时，应使用负载均衡地址，实现高可用。应避免将业务程序直连到某个单独的计算节点。 说明： 针对公网访问数据库的场景，同样应避免将业务程序直连到某个单独的计算节点，请参考[通过弹性负载均衡绑定弹性公网IP连接实例](https://support.huaweicloud.com/redisug-nosql/nosql_11_0105.html)使用外置ELB进行配置。                                                                                                                                                                                                                                                                                          |
| 5  | 使用连接池，避免使用单连接以及大量短连接。                                 | 由于单连接有高可用风险，而短连接性能差且会消耗大量数据库CPU和网络资源，容易造成瓶颈，因此建议业务程序使用主流SDK的连接池连接GeminiDB Redis实例。                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 6  | 业务禁止使用空Key（长度为0的Key）                                  | GeminiDB Redis不拦截空Key（Empty Key）。写入或操作空Key将引发未定义行为，导致实例运行异常甚至服务中断。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 7  | 当实例中Key数量大于1000个时，禁止执行Keys命令                          | Keys命令是典型的高危命令，会一次性获取整个实例中的全部数据内容并返回给客户端。当实例中Key数量较多时，执行Keys命令会引起请求阻塞或实例状态异常。                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 8  | 避免元素Value过大，避免单Key包含的元素数量过多。                          | 建议String类型Key的Value小于10KB，Hash/List/Zset/Set等类型Key中包含元素数小于5000，且单个元素Value小于1KB。 说明： 与社区Redis一样，GeminiDB Redis对大Key存储并不做严格约束，因此需要用户根据规范合理开发业务程序。                                                                                                                                                                                                                                                                                                                                           |
| 9  | 避免单个命令中一次性操作过多元素或产生过大的网络收发包。                          | - 建议MSET/MGET等批量操作Key命令中同时操作的Key数量小于1000。  - 建议HMSET、HGETALL、LRANGE、ZADD、ZRANGE等同时操作Key中多元素的命令同时操作元素数量小于1000。  - 由于社区Redis语法中ZREMRANGEBYSCORE命令不提供limit参数，无法控制单次删除的元素数量，建议使用ZRANGEBYSCORE (带limit)+ZREM的先查后删方式替代。 说明： 与社区Redis一样，GeminiDB Redis对大Key访问并不做严格约束，因此需要用户根据规范合理开发业务程序。    |
| 10 | 合理打散Key分布，避免出现热点Key或热点hashtag瓶颈。                      | 对单个Key或具有同hashtag的一组Key的高频访问依赖会产生热Key问题，容易引发计算资源倾斜，请求排队，响应变慢等瓶颈问题。热Key的产生往往来自业务设计对Key的拆分程度不足，需要业务拆分优化。 说明： 反面案例： - 对全局超大排行榜高频集中访问。  - 全实例中仅保存几个Hash Key，每个Key用于存储一整张表格的信息量。  - 商品库存业务中，全实例Key仅使用少量hashtag分桶，导致热点hashtag查询排队。                    |
| 11 | 单次Pipeline中打包命令数量建议小于100条。                            | 使用Pipeline时应遵循"单次少量，分多次"原则。 根据使用经验，并非Pipeline打包数量越大性能越好，不合理的Pipeline用法将可能导致实例CPU、带宽等资源瓶颈，甚至引起请求阻塞。 说明： 与社区Redis相比，GeminiDB Redis对Pipeline的使用并不做严格约束，因此需要用户根据规范合理开发业务程序。                                                                                                                                                                                                                                                                                                                     |
| 12 | 避免在Lua脚本中引入高耗时代码。                                     | 使用Lua脚本时应遵循轻量化原则，避免引入执行命令次数过多、长时间sleep、大的循环语句等不合理用法。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 13 | 避免在事务中打包过多命令。                                         | 使用事务时应遵循轻量化原则，避免单次事务中打包过多命令或复杂度过高的命令。执行的事务中包含命令过多会引起请求阻塞或实例状态异常。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| 14 | 避免在不同数据类型下使用相同的Key名称。                                 | 社区Redis强制禁止在不同数据类型下使用相同的Key名称。虽然GeminiDB Redis对此不做强制约束，但开发时应当避免此类用法，保持程序清晰和易维护。                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| 15 | 谨慎使用批量删除命令                                            | 若针对一个包含大量元素的LIST/ZSET对象使用批量删除命令（例如LREM/LTRIM/ZREMRANGEBYSCORE等），要避免在单条命令中删除过多的数据（比如删除数万或者数十万元素）。过多的数据删除可能导致该条删除命令耗时过长，影响其它正常命令，或者导致系统内存OOM进程重启，实例异常；极端场景下，造成服务进程反复拉起失败。                                                                                                                                                                                                                                                                                                                                                                                  |
| 16 | scan返回的cursor使用64位无符号类型进行解析                           | 和开源Redis保持一致，GeminiDB使用64位无符号类型对cursor进行编码，因此，对返回的cursor用户需要使用64位无符号类型进行解析。否则可能会解析错误，错误解析结果输入到GeminiDB可能返回"invalid cursor"的报错。                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 17 | 使用redis inline时，命令长度需要小于64KB                          | 和开源Redis行为保持一致，为避免OOM等风险，超过64KB输入服务端会返回错误"ERR Protocol error: too big inline request"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 18 | 尽量减少subscribe族、阻塞命令（brpop等）的使用，避免服务端连接资源消耗殆尽，无法接受新的连接 | proxy到shard通信会维护一套共享连接池，普通命令会复用这些连接。对于阻塞命令（brpop等）、subscribe族命令使用，proxy需要创建到shard的独享连接，造成单个shard承载的连接数显著增加，最终可能会突破单进程的连接数限制，无法建立新的连接。因此，我们建议在单个proxy上使用阻塞命令或subscribe族命令的客户端连接小于1000，避免出现上述情况。                                                                                                                                                                                                                                                                                                                                                           |
   
#### 运维规范
在日常运维工作中需关注以下运维规范，预防潜在风险并掌握关键应急方案。
表2GeminiDB Redis运维规范 
| 编号 | 运维规范                                         | 说明                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|
| 1  | 确保您的华为云账号绑定的电话号码、电子邮箱等联系方式有效，以便及时收到服务相关通知信息。 | 华为云服务会在变更、升级、故障通知等必要场景通过网站、邮箱、短信、站内信等方式向您送达通知信息，请确保账号绑定的联系方式有效。                                                                                                                                                                                                                                                                                                                                          |
| 2  | 订阅重要告警。                                      | - 订阅例如大Key访问、存储容量高、连接数使用率高、CPU使用率高等告警，从而在数据库实例出现风险时提早发现并及时处理。  - 推荐告警配置请参考[设置GeminiDB Redis告警规则](https://support.huaweicloud.com/redisug-nosql/nosql_10_0037.html)。                                                                        |
| 3  | 使用负载均衡地址访问时，需要配置访问控制管理，而不是安全组。               | 负载均衡地址不支持安全组，创建完成后请配置IP访问控制，如未配置白名单，所有与VPC互通的IP地址均可访问实例。具体操作请参考[GeminiDB Redis实例设置访问控制](https://support.huaweicloud.com/redisug-nosql/nosql_10_0151.html)。                                                                                                                                                                                                                                               |
| 4  | 建议预留50%以上存储空间，避免实例进入只读。                      | GeminiDB采用rocksdb作为存储引擎，数据会定期compact以优化读性能。compact期间，会产生临时文件造成存储空间短暂上涨。与业务模型相关，最坏情况可能会上涨2倍，磁盘存储相对便宜，建议预留50%空间。                                                                                                                                                                                                                                                                                           |
| 5  | 配置实例自动扩容。                                    | GeminiDB Redis支持自动扩容，可以有效避免数据量突增问题。建议参见[GeminiDB Redis实例自动扩容磁盘](https://support.huaweicloud.com/redisug-nosql/nosql_10_0432.html)开启自动扩容。                                                                                                                                                                                                                                                                 |
| 6  | 保持负载处于健康水位。                                  | - 如业务数据量长期高于80%，建议及时扩容。  - 如业务流量超过实例QPS基准，或CPU利用率长期高于80%，建议及时升级规格或增加节点，避免过载影响业务访问。  - 在业务流量、连接数等指标突增导致实例算力资源超载的紧急场景，应通过水平添加节点快速提升集群算力。垂直升配CPU规格为滚动模式，耗时较长，不建议用于紧急场景。   |
| 7  | 重命名高危命令。                                     | 对于高危命令（如flushall、keys），建议您禁用或重命名，以增强实例的安全性。具体操作请参考文档[命令重命名](https://support.huaweicloud.com/redisug-nosql/nosql_10_0053.html)。                                                                                                                                                                                                                                                                           |
| 8  | 慎用账号管理中的flushall操作。                          | - 具有读写权限的子账号在执行flushall时，会清空实例所有的数据。  - 请禁用flushall操作，确认DB后可执行flushdb操作（慎用）。                                                                                                                                                         |
| 9  | 定期进行大key在线诊断。                                | 大Key访问是Redis使用中的常见问题。建议在控制台定期查看实例的大Key诊断报告。具体操作请参考[大Key诊断](https://support.huaweicloud.com/redisug-nosql/nosql_03_0238.html)。                                                                                                                                                                                                                                                                            |
| 10 | 割接结束后执行dbsize。                               | 在割接场景中，如确认源端和目标端均无过期 key，数据导入完成数分钟后可执行 dbsize 对比 key 数量，辅助判断导入前后 key 数是否一致。dbsize 不能校验 value、TTL、数据类型或内容一致性；如业务需要完整一致性校验，请结合抽样校验、全量校验工具或业务侧校验流程。                                                                                                                                                                                                                                                         |
   
