
# 使用紧凑型编码实现小对象存储
GeminiDB采用RocksDB作为底层存储引擎。由于 RocksDB 仅支持键值（KV）存储模型，系统需要将各类数据结构转换为 KV 格式进行存储，这一过程涉及数据编码。在传统编码方案中，存储包含 N 个 field-value 对的hash对象需要 N+1 个 KV 对，这导致执行 HGETALL 命令时需要执行 N+1 次读取操作。在部分业务场景中，如广告RTA，hash类型数据特征为单个元素字节少且元素数量不多，可使用GeminiDB hash紧凑型编码方案，进一步提升读性能。紧凑型编码方案的核心在于将 N 个 field-value 对与 1 个元数据对编码到单个 KV 对中，从而减少读取次数，使 HGETALL/HMGET 命令的性能得到大幅提升。目前，紧凑型编码方案仅支持hash数据类型的小对象存储优化。
#### 应用场景
由于紧凑型编码将所有 field-value 对存储在同一个 KV 对中，因此不适用于单个hash 对象过大的场景。该编码方式最适合以下特征的 Hash 数据：
- 单个hash对象大小≤1KB。
- 单个hash对象field-value对数量在10-50之间。
 
#### 使用须知
- 紧凑型编码仅支持hash类型。
- 紧凑型编码不适用于大对象，大对象场景使用紧凑型编码可能导致hset/hmset命令时延上升。
- 不支持编码降级，开关仅对新增对象生效，不会自动对已有对象进行改造。
 
#### 配置与使用说明
- 启用/禁用紧凑型编码 参考[通过负载均衡地址连接实例（推荐）](https://support.huaweicloud.com/redisug-nosql/nosql_02_0077.html)通过执行" CONFIG SET"命令动态调整"small-hashobj-encode-size"参数，控制是否启用紧凑型编码。
  
  |    参数    |                                                                                                                    small-hashobj-encode-size                                                                                                                     |
  |---|---|
  | **单位**   | Byte                                                                                                                                                                                                                                                             |
  | **默认值**  | 0（禁用紧凑型编码，使用传统编码）                                                                                                                                                                                                                                                |
  | **推荐值**  | 1024                                                                                                                                                                                                                                                             |
  | **参数说明** | - 0：禁用紧凑型编码，所有 hash 对象均采用传统编码存储。  - 1024：启用紧凑型编码，仅当 Hash 对象大小 ≤ 1024B 时生效；若对象大小超过该阈值，仍使用传统编码。   |
     
  

- 查看对象的编码格式 执行以下命令可查看指定 Key 的存储格式：
  ```
  OBJECT STORAGEFORMAT <key>
  ```
  ![](https://support.huaweicloud.com/redisug-nosql/zh-cn_image_0000002267552289.png "点击放大")
  ![](https://support.huaweicloud.com/redisug-nosql/zh-cn_image_0000002232513058.png "点击放大")
  

- 手动转换对象的编码格式 若需将紧凑型编码的 Key 切换回传统编码，可执行：
  ```
  OBJECT REFORMAT <key> NORMAL
  ```
  注意：不支持将传统编码转换为小对象编码。
  
![](https://support.huaweicloud.com/redisug-nosql/public_sys-resources/note_3.0-zh-cn.png)
命令无差别：无论对象采用传统编码或紧凑型编码，所有操作命令（如 HGET、HSET 等）均保持兼容，无需额外适配。
