2026-10-24 21:35:19
Redis中的Bitmap通过位操作实现高效存储与计算,适用于签到、活跃统计、在线状态等场景,核心优势是节省空间且操作复杂度为O(1)。
核心命令与原理
Redis的Bitmap基于字符串类型扩展,通过SETBIT key offset value(设置位)和GETBIT key offset(获取位)操作单个二进制位,BITCOUNT统计1的个数,BITOP支持位运算(AND/OR/XOR/NOT)。每个位通过偏移量(offset)定位,空间占用公式为(offset/8/1024/1024)MB。例如,存储5000万用户的在线状态仅需约6MB(50000000/8/1024/1024)。
场景一:用户签到系统
以用户ID为key,日期偏移量为offset存储签到状态。例如,用户UID=1从2017-01-01开始签到,2017-01-21的偏移量计算为(strtotime('2017-01-21') - strtotime('2017-01-01')) / 86400 = 20。通过SETBIT sign_1 20 1记录签到,GETBIT sign_1 20查询状态,BITCOUNT sign_1统计总签到次数。一年数据仅需约45字节(365/8),30年仅1.31KB,空间效率极高。
场景二:活跃用户统计
以日期为key,用户ID为offset记录活跃状态。例如,2017-01-10的活跃用户为1-10号,通过SETBIT stat_2017-01-10 1 1等命令设置。统计多日活跃用户时,使用BITOP AND destkey key1 key2对多日数据按位与,结果中1的个数即为连续活跃用户数。如统计2017-01-10至2017-01-12的活跃用户,BITOP AND stat stat_2017-01-10 stat_2017-01-11 stat_2017-01-12后,BITCOUNT stat返回6,表示6人三日均活跃。
场景三:用户在线状态管理
以固定key(如online)存储所有用户在线状态,用户ID为offset。上线时SETBIT online uid 1,下线时SETBIT online uid 0。查询单个用户状态用GETBIT online uid,批量查询可通过GET online获取整个字符串后自行解析(避免逐个查询的延迟)。5000万用户仅需6MB空间,且位操作复杂度为O(1),适合高并发场景。
注意事项
Bitmap通过位操作将空间效率提升至极致,是Redis中处理布尔型数据的理想方案,尤其适合大规模用户状态的存储与统计。