位图索引通过将权限映射为整数的二进制位实现高效校验,固定枚举编号、单用户仅需8字节存储、零查询位运算判断权限,超64项时分段管理,内存节省95%以上。

用位图索引优化权限判断,核心是把“用户拥有哪些权限”压缩成一个整数(或少量整数),每个二进制位代表一项权限的开关状态。它不存字符串、不查表、不遍历集合,一次位运算就能得出结果,内存和性能都大幅下降。
权限编号必须固定且连续
不能用数据库自增ID当权限位序号,必须由代码层统一定义枚举:
- PERM_READ = 1 → 位0(值为1)
- PERM_WRITE = 1 → 位1(值为2)
- PERM_DELETE = 1 → 位5(值为32)
新增权限只能追加高位(如第6位起),不可重排已有编号,否则历史用户权限数据会错乱。
单用户权限用一个整数存储
假设系统共定义了42项权限,用 uint64_t(64位)完全够用:
- 用户A有读、写、删除 → 对应位0、1、5 → 位图值 =
0b000001000011=35 - 用户B只有读 → 位图值 =
0b000000000001=1 - 所有用户权限数据从原来存几十个URL字符串(约20KB/人),压缩到仅8字节/人
权限校验直接位运算,零查询
判断用户是否有某权限,只需两步:
- 取用户权限位图值(如从 JWT 或 Redis 中读出)
- 执行
bitmap & PERM_WRITE != 0
复合逻辑也简单:
- 同时有读和写:
(bitmap & (PERM_READ | PERM_WRITE)) == (PERM_READ | PERM_WRITE) - 有读但无删:
(bitmap & PERM_READ) && !(bitmap & PERM_DELETE) - 排除导出权限:
allowed = bitmap & ~EXPORT_MASK
超百项权限时分段管理
若权限总数超过64,可改用 uint64_t[2] 数组:
- 低64位:基础权限(如CRUD、页面访问)
- 高64位:扩展权限(如审计、配置、租户级操作)
- 查权限时先定位所属段,再查对应位;Redis中可用
BITFIELD分段操作
实测:1000个权限编码下,RoaringBitmap压缩后仅占1.22KB,比原始字符串存储节省95%以上内存。











