首页/数据/数据库速查/Set 编码(intset / listpack / hashtable)
Redis 命令96 条

Set 编码(intset / listpack / hashtable)

全整数且不超 set-max-intset-entries(默认 512)用 intset;7.2+ 小集合可用 listpack;否则 hashtable。转换同样单向不可逆。

数据库速查数据更新于 2026-10-12

观察

观察
SADD nums 1 2 3
OBJECT ENCODING nums      # intset
SADD nums abc
OBJECT ENCODING nums      # hashtable(加入非整数即转换)
SADD str x y z
OBJECT ENCODING str       # listpack(7.2+ 小集合)或 hashtable
intset整数集合,内存极省
listpack7.2+ 小集合紧凑编码
hashtable通用大集合
阈值set-max-intset-entries=512;set-max-listpack-entries=128
整型集合的 intset 查找是二分(有序数组),性能好且省内存;一旦混入字符串就转 hashtable,内存翻倍是常态。

易错点

  • ID 集合混入一个字符串 ID:整个集合转 hashtable,内存显著上升
  • 以为把非整数成员删掉能变回 intset:转换不可逆

数据来源与参考

  • Redis 官方文档: OBJECT ENCODING
  • Redis 官方文档: 内存优化(set-max-intset-entries)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌