🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
《C语言》 | 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 | 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 | 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 | 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 | 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 | 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
🔧 核心命令详解
1. 设置与获取位值
2. 统计与位运算
3. 高级位操作
💡 经典应用场景
1. 用户签到系统
2. 活跃用户分析
3. 布隆过滤器
4. 特性标记
⚠️ 使用技巧与注意事项
Redis Bitmap 是一种通过二进制位来高效存储和操作数据的技术,特别适合记录大量的布尔值状态(如是/否、真/假)。下面这张表格汇总了其核心命令,帮你快速建立整体印象。
命令 | 语法 | 描述 | 时间复杂度 |
|---|---|---|---|
SETBIT |
| 设置或清除指定偏移量上的位 (0 或 1) | O(1) |
GETBIT |
| 获取指定偏移量上的位值 | O(1) |
BITCOUNT |
| 计算给定范围内被设置为 1 的位的数量 | O(N) |
BITOP |
| 对多个 Bitmap 执行位运算 (AND, OR, XOR, NOT) | O(N) |
BITPOS |
| 查找第一个被设置为指定值的位 | O(N) |
BITFIELD |
| 在一次调用中处理多个位范围,用于操作整数 | O(1) |
🔧 核心命令详解
1. 设置与获取位值
SETBIT:用于设置指定偏移量的位值(0或1)。如果偏移量超过当前位图长度,Redis 会自动扩展位图,并用0填充中间的空位。# 记录用户1001在第5天签到 SETBIT sign:user:1001 5 1GETBIT:获取指定偏移量的位值。如果偏移量不存在或 key 不存在,则返回0。# 检查用户1001在第5天是否签到 GETBIT sign:user:1001 5
2. 统计与位运算
BITCOUNT:统计位图中1的个数,常用于计算总数,如总签到天数。可以通过start和end参数指定统计的字节范围。# 统计用户1001的总签到天数 BITCOUNT sign:user:1001BITOP:支持对多个位图进行交集 (AND)、并集 (OR)、异或 (XOR) 和非 (NOT) 运算,结果存储于destkey。例如,找出两天都签到的用户:# 计算20240501和20240502两天都签到的用户 BITOP AND sign:both 20240501 20240502 BITCOUNT sign:both
3. 高级位操作
BITPOS:查找第一个值为 0 或 1 的位的位置,可用于查找首次签到日期等。# 查找用户1001的第一次签到是在哪一天 BITPOS sign:user:1001 1BITFIELD:更强大的命令,允许你将位图视为一个由多个整数组成的数组,可以原子性地读取、设置或增加特定偏移量和位宽表示的整数值,非常适合管理如用户积分等复杂场景。
💡 经典应用场景
1. 用户签到系统
这是 Bitmap 最经典的应用。可以为每个用户创建一个位图(例如sign:user:1001),将一年中的每一天作为偏移量(0-364),签到则设为1。
统计连续签到天数:结合
GETBIT和循环判断,可计算连续签到天数。计算月度签到次数:使用
BITCOUNT可快速统计某月的签到天数。
2. 活跃用户分析
通过每天一个位图(例如active:20240501),将用户ID作为偏移量,记录其是否活跃。
计算某段时间内的活跃用户:使用
BITOP OR运算多日位图,再对结果使用BITCOUNT,即可得到这段时间内的总活跃用户数。计算连续活跃用户:使用
BITOP AND运算多日位图,即可得到这些天都活跃的用户群。
3. 布隆过滤器
Bitmap 是实现布隆过滤器的理想底层数据结构。布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能存在于一个集合中(可能有误判,但绝不会漏判)。它使用多个哈希函数将元素映射到 Bitmap 的多个位上。查询时,只有所有对应位都为1,才认为元素可能存在。
4. 特性标记
可以为海量对象(如商品、视频)打上布尔型标签(如是否热门、是否有库存)。每个属性使用一个位图,对象ID作为偏移量。
# 标记视频ID为12345的为"热门"视频 SETBIT flag:hot 12345 1 # 检查视频12345是否为"热门" GETBIT flag:hot 12345⚠️ 使用技巧与注意事项
内存占用优势与预分配考量:Bitmap 非常节省空间。例如,记录1亿用户某一天是否活跃,仅需约 100000000 / 8 / 1024 / 1024 ≈ 12MB 内存。但需要注意,当首次设置一个非常大的偏移量(如
SETBIT huge_bitmap 100000000 1)时,Redis 需要一次性分配足够的内存,这可能会导致短暂的阻塞。对于已知的大偏移量,可考虑预先设置一个较小的偏移量来触发内存分配。分片策略:单个 Bitmap 的偏移量上限约为 2^32。对于超大规模数据(如用户ID超过数亿),建议进行分片。例如,可按用户ID范围分片:
sign:user:shard1(UID 0-999999),sign:user:shard2(UID 1000000-1999999)。理解
BITCOUNT的范围参数:BITCOUNT key start end中的start和end参数指的是字节偏移量,而不是位偏移量。一个字节等于8位。例如,BITCOUNT mybitmap 0 0统计的是第一个字节(即偏移量0-7的位)中1的个数。选择合适的数据类型:Bitmap 虽好,但并非万能。它最适合存储密集的布尔值。如果需要存储更多状态或每个用户需要关联多个属性,传统的 String、Hash 等结构可能更合适。
希望这份指南能帮助你掌握 Redis Bitmap 的强大功能!如果你在实现特定场景时遇到具体问题,例如如何设计分片键或优化查询性能,我们可以继续深入探讨。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙