Valkey源码剖析(16):对象编码的转换

如前所述,由于Valkey中几乎每种对象都拥有不止一种编码方式,所以随着对象存储的数据发生变化,对象所使用的编码也会发生变化:Valkey把这种现象被称之为“编码转换”,其中由较低级编码转换为较高级编码的转换为升级,而由较高级编码转换为较低级编码的转换为降级。

以集合对象为例:

  • 如果一个集合对象只包含了少量几个可以被解析为整数的元素,那么Valkey将使用INTSET方式编码它。

  • 如果这个集合对象之后新增了几个字符串元素,但是整个集合的体积仍然非常小,那么Valkey将把该对象的编码从INTSET升级为LISTPACK。

  • 如果这个集合对象之后新增了大量元素,其数量已经无法使用LISTPACK存储,这时Valkey将把该对象的编码从LISTPACK升级为HASHTABLE。

与此相反,当HASHTABLE编码的集合对象的元素数量重新降低至LISTPACK编码能够容纳的数量时,集合对象的编码又会从HASHTABLE降级为LISTPACK;而当集合对象的元素数量进一步减少,并且所有元素都能被解析为整数时,集合对象的编码又会从LISTPACK降级为INTSET。

随着对象存储的数据不断地发生变化,类似的编码转换操作也会不断地发生。

黄健宏
2026.1.12