Redis 集合对象底层哈希和整数集合怎么动态转换

落枫酱_3310

落枫酱_3310

2026-09-07

514人浏览

原创

Redis集合对象底层自动在intset和hashtable间转换:纯整数且数量≤set-max-intset-entries(默认512)时用intset,否则升为hashtable且不可逆;intset内部支持16/32/64位整数类型升级,不触发编码变更。

redis 集合对象底层哈希和整数集合怎么动态转换

Redis 集合对象的底层转换不是手动触发的,而是由 Redis 自动根据数据特征和配置阈值实时判断、无缝升级的。核心逻辑围绕两个结构的适用边界展开:intset(整数集合)用于轻量、纯整数场景;hashtable(哈希表)兜底通用、大规模或混合类型场景。

intset 和 hashtable 的切换条件很明确

  • 集合必须同时满足以下两点,才用 intset 编码:

    • 所有元素都是整数值(例如 1, -100, 32767),不能是 "1" 字符串或 "abc";
    • 元素总数量 ≤ set-max-intset-entries 配置值(默认是 512)。
  • 只要违反其中任一条件,Redis 就立刻将底层从 intset 升级为 hashtable,且该过程不可逆。

例如:

127.0.0.1:6379> SADD myset 1 2 3
(integer) 3
127.0.0.1:6379> OBJECT ENCODING myset
"intset"

此时是 intset;但只要执行:

127.0.0.1:6379> SADD myset "hello"
(integer) 1
127.0.0.1:6379> OBJECT ENCODING myset
"hashtable"

插入一个字符串,编码瞬间变成 hashtable —— 不需要重启、不阻塞命令、用户无感知。

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载

intset 内部还有“类型升级”,和哈希表无关但影响内存布局

intset 本身支持三种整数编码:INTSET_ENC_INT16(每个元素占 2 字节)、INTSET_ENC_INT32(4 字节)、INTSET_ENC_INT64(8 字节)。
当插入一个超出当前编码范围的整数时,intset 会一次性扩容并重写整个数组,把所有老元素转成更大类型。

比如初始存 1, 2, 3 → 用 INT16;
再插入 65536(>65535)→ 整个 intset 升级为 INT32,所有元素重新存储。

这个过程仍保持 intset 编码,不触发到 hashtable 的转换。

hashtable 是真正的“万能模式”

一旦进入 hashtable 编码:

  • 所有元素都作为 key 存入字典,value 固定为 NULL;
  • 支持任意字符串(包括数字字符串 "123"、空格、二进制数据);
  • 查找、添加、删除平均时间复杂度为 O(1);
  • 内存开销明显高于 intset(指针、哈希桶、空闲槽位等);
  • 即使后续删光非整数、只剩几个小整数,也不会降级回 intset。

你可以通过配置调整 intset 的容量上限:

CONFIG SET set-max-intset-entries 1024

但注意:已升级为 hashtable 的集合不会因此回退。

实际使用中要注意的细节

  • SADD 是唯一可能触发编码变更的写命令(其他如 SREM、SISMEMBER 都只读或不改变结构);
  • SMEMBERS 返回顺序在 intset 下是升序(因有序数组),在 hashtable 下是哈希遍历顺序(看似随机,实际稳定);
  • 监控编码变化可用 OBJECT ENCODING ,排查内存异常时很有用;
  • 如果业务确定只存整数且总量可控,可适当调高 set-max-intset-entries,但超过几千后 intset 的 O(log n) 查找优势减弱,hashtable 的 O(1) 更稳。

不复杂但容易忽略。

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4829

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4375

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

8392

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

663

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

8622

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1180

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1336

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7398

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习