游乐游手机版
首页/数据库/文章详情

Redis Bitmap 位图操作详解与实战指南

时间:2026-09-01 06:16
Redis Bitmap 通过 bit 位存储布尔数据,极大节省内存。本文详解位图原理、自动扩容机制及 SETBIT、GETBIT、BITCOUNT 等核心命令,结合签到统计等实战场景,帮助开发者高效处理海量状态数据。

在记录用户签到、登录状态等布尔型数据时,传统键值对存储会消耗大量内存。Redis 提供的 Bitmap 位图结构将每个状态压缩至 1 个 bit,支持自动扩容与高效统计。本文将解析位图底层原理,演示核心命令用法,并提供内存优化与性能评估依据。

位图核心原理与内存优势

位图(Bitmap)在 Redis 中属于 String 数据类型,本质是一个字节数组(bytes array)。Redis 字符串最大可存储 512 MB 内容,每个字节由 8 个 bit 组成。位图通过直接操作 bit 位(设置为 0 或 1)来存储数据,理论存储上限可达 2^32 个位。

位数组

以用户年度签到为例,若使用普通 String 存储,需为 365 天创建 365 个键值对;而使用位图,每天仅需 1 个 bit,一年 365 天仅占用约 46 字节。通过统计值为 1 的 bit 数量,即可快速得出签到天数。位图操作不仅大幅降低内存占用,还具备极高的读写效率。

自动扩容机制与二进制映射

Redis 位数组支持自动扩展。当设置的偏移量(offset)超出当前字符串长度时,Redis 会自动将中间未设置的位填充为 0,并扩容至目标位置。

以下演示如何通过位图操作将 key a 的值构建为字符串 "he"。首先获取字符的 8 位二进制码:

>>> bin(ord("h"))
'0b1101000'
>>> bin(ord("e"))
'0b1100101'

将二进制码拼接后,从下标 0 开始编号,值为 1 的偏移量依次为 1、2、4、9、10、13、15。初始 key 的所有位均为 0,通过 SETBIT 命令设置对应偏移量:

127.0.0.1:6379> SETBIT a 1 1
(integer) 0
127.0.0.1:6379> SETBIT a 2 1
(integer) 0
127.0.0.1:6379> SETBIT a 4 1
(integer) 0
127.0.0.1:6379> GET a
"h"
127.0.0.1:6379> SETBIT a 9 1
(integer) 0
127.0.0.1:6379> SETBIT a 10 1
(integer) 0
127.0.0.1:6379> SETBIT a 13 1
(integer) 0
127.0.0.1:6379> SETBIT a 15 1
(integer) 0
127.0.0.1:6379> GET a
"he"
bitmap位图应用

若操作后对应字节包含不可打印字符,Redis 会以十六进制形式显示。例如:

127.0.0.1:6379> SETBIT b 0 1
(integer) 0
127.0.0.1:6379> SETBIT b 1 1
(integer) 0
127.0.0.1:6379> GET b
"\xc0"

核心位图命令详解

SETBIT:设置或清除指定位

用于设置或清除某一位的值,返回该位修改前的旧值。初始状态下所有位均为 0。

SETBIT key offset value

offset 为从 0 开始的偏移量。示例:

127.0.0.1:6379> SET user:1 a
OK
127.0.0.1:6379> SETBIT user:1 0 1
(integer) 0
127.0.0.1:6379> GET user:1
"\xe1"

GETBIT:获取指定位的值

返回指定偏移量处的 bit 值(0 或 1)。

127.0.0.1:6379> GETBIT user:1 0
(integer) 1

offset 超出字符串长度或 key 不存在,命令返回 0:

redis> EXISTS bits
(integer) 0
redis> GETBIT bits 100000
(integer) 0

BITCOUNT:统计值为 1 的位数

统计指定区间内值为 1 的 bit 数量。支持通过 startend 限定字节范围,参数规则与 GETRANGE 一致,支持负数索引(如 -1 表示最后一个字节)。

BITCOUNT key [start end]

示例:

127.0.0.1:6379> BITCOUNT user:1
(integer) 8

典型应用场景与性能评估

位图特别适用于海量布尔状态记录,如用户签到、登录频次、在线状态标记等。通过 1 和 0 的紧凑排列,可快速统计活跃用户数或连续签到天数。

Redis 官方曾进行压力测试:模拟 1 亿 2 千 8 百万用户的系统,使用位图统计日均活跃用户数量,耗时仅约 50ms,且内存占用仅为 16 MB。这一数据充分验证了位图在大规模状态统计中的高效性与低开销特性。

在线练习工具:https://try.redis.io/
查看更多命令:https://redis.io/commands

来源:https://m.biancheng.net/redis/bitmap.html
上一篇Redis List 列表:底层结构、常用命令与队列栈实现 下一篇Redis string字符串底层结构SDS与常用命令详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis是什么:核心特性、架构与应用场景解析
数据库 · 2026-09-01

Redis是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

Windows 安装 MongoDB 完整图文教程
数据库 · 2026-09-01

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动
数据库 · 2026-09-01

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

MacOS安装MongoDB完整教程
数据库 · 2026-09-01

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

Ubuntu系统安装与配置Redis完整指南
数据库 · 2026-09-01

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。