讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么在Redis中操作偏移量过大的BitMap会导致内存瞬间打满

大晨姑娘_7376

大晨姑娘_7376

发布时间:2026-10-03 11:01:29

|

631人浏览过

|

来源于php中文网

原创

Redis位图稀疏时内存暴增因SETBIT按字节对齐整块分配,设第100万bit即分配125KB并填充零字节;分段存储可缓解但需手动路由且不支持跨段BITOP。

为什么在redis中操作偏移量过大的bitmap会导致内存瞬间打满

因为 SETBIT 不是“只存你设的那一位”,而是按字节对齐、整块 malloc —— 设第 100 万 bit,Redis 就会分配 125001 字节(1000000 ÷ 8 + 1),中间全填 0,不管其他位有没有值。

SETBIT 的内存分配是刚性的,不是稀疏的

Redis 的 Bitmap 底层就是 string 类型(raw 或 embstr),没有稀疏结构支持。它不区分“用了哪几个 bit”,只看最大 offset:

  • 调用 SETBIT user:active 9999999 1 → 计算需 12499999 ÷ 8 + 1 = 12500000 字节 ≈ 12.5MB
  • 哪怕你之前只设过 3 个 offset(比如 0、1、9999999),这 12.5MB 也照常分配并驻留
  • 如果业务用用户 ID 当 offset,而 ID 是 64 位 Long(如 1234567890123),那直接触发 2^32 上限溢出或分配 256MB+ 内存

为什么 BITCOUNT/BITPOS 会变慢,甚至拖垮 CPU 缓存

这些命令必须遍历整块已分配内存,无法跳过全零区域:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • BITCOUNT 对 125MB 字符串做 popcount,哪怕里面只有 1 个 1,也要扫完全部
  • BITPOS key 1 在稀疏场景下平均要扫描到末尾才命中,缓存行大量失效
  • RDB/AOF 持久化时,这 125MB 的零字节全写盘,备份体积虚高、恢复慢

集群环境下还会放大问题:单 key 热点 + slot 倾斜

所有操作都打到同一个 key,意味着打到同一个 Redis 实例的同一个 slot:

  • 无法利用集群横向扩展能力,QPS 上不去,CPU 和内存双爆
  • 迁移或扩缩容时,这个大 key 会卡住整个 slot 迁移流程
  • SCAN "user:active*" 效率极低,而 KEYS 直接阻塞主线程

分段存储不是自动的,路由和兜底都得自己写

把 user:active 拆成 user:active:seg:0、user:active:seg:1… 只是开始:

  • 段长选太小(如 100)→ key 数爆炸,EXPIRE、DEL、SCAN 压力陡增
  • 段长选太大(如 50 万)→ 单段仍可能吃掉上百 MB,没解决根本问题
  • BITOP 不跨段,想算交集?得在应用层 GET 多段二进制串,用 & 运算合并
  • 某段 key 不存在时,GET 返回 nil,但 BITCOUNT 遇 nil 直接报错,必须先 EXISTS

真正容易被忽略的,是业务是否真的需要“任意 offset 的精确 bit 操作”——比如统计“过去三年每天登录”,用 Bitmap 存 1095 位没问题;但存“所有用户 ID 是否参与”,ID 稀疏又带长尾,就该换时间序列或布隆过滤器(接受误差)或分库分表式标记。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

470

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

323

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

493

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

263

2025.11.27

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

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

4249

2023.11.02

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

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

3755

2023.11.14

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

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

6752

2024.04.02

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

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

623

2024.04.07

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

40

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn