Redis 数据类型Bitmaps(位图)

目录

[1 基本特性](#1 基本特性)

[2 主要操作命令](#2 主要操作命令)

[2.1 SETBIT key offset value](#2.1 SETBIT key offset value)

[2.2 GETBIT key offset](#2.2 GETBIT key offset)

[2.3 BITCOUNT key start end](#2.3 BITCOUNT key [start] [end])

[2.4 BITOP operation destkey key key ...](#2.4 BITOP operation destkey key [key ...])

[2.5 BITPOS key bit start end](#2.5 BITPOS key bit [start] [end])

[3 使用场景](#3 使用场景)


Redis 的位图(Bitmaps)并不是一种独立的数据类型,而是基于字符串(String)数据类型的一种特殊应用。位图允许你将一个字符串视为一系列的二进制位(bit),每个位可以是 0 或 1。通过这种方式,你可以非常高效地处理大量布尔值。

1 基本特性

  • 空间效率:位图使用非常紧凑的存储方式,因为每个位只占用 1 比特。例如,一个包含 1000 万个布尔值的位图只需要大约 1.2 MB 的内存。
  • 原子操作:位图支持原子操作,可以在不锁定整个键的情况下修改单个位。
  • 位级操作:提供了丰富的位级操作命令,如设置、获取和计算位的数量等。

2 主要操作命令

2.1 SETBIT key offset value

设置指定偏移量处的位为 value(0 或 1)。如果该位不存在,则扩展字符串。

复制代码
127.0.0.1:6379> setbit bitmap 0 1
(integer) 0
2.2 GETBIT key offset

获取指定偏移量处的位值。

复制代码
127.0.0.1:6379> getbit bitmap 0
(integer) 1
2.3 BITCOUNT key start end

计算字符串中被设置为 1 的位的数量。可选参数 startend 用于指定范围。

复制代码
127.0.0.1:6379> setbit bitmap 0 1
(integer) 0
127.0.0.1:6379> setbit bitmap 1 1
(integer) 0
127.0.0.1:6379> setbit bitmap 2 0
(integer) 0
127.0.0.1:6379> setbit bitmap 3 1
(integer) 0
127.0.0.1:6379> bitcount bitmap
(integer) 3
2.4 BITOP operation destkey key key ...

对多个字符串执行位运算,并将结果存储在 destkey 中。支持的操作包括 ANDORXORNOT

  • AND 操作

    • 对所有输入键中的每一位执行按位与操作。
    • 只有当所有输入键在相应位置上的位都为 1 时,结果才为 1。
  • OR 操作

    • 对所有输入键中的每一位执行按位或操作。
    • 只要有一个输入键在相应位置上的位为 1,结果就为 1。
  • XOR 操作

    • 对所有输入键中的每一位执行按位异或操作。
    • 如果输入键在相应位置上的位中有奇数个 1,结果为 1;否则为 0。
  • NOT 操作

    • 对单个输入键中的每一位执行按位非操作。
    • 将每一位取反,1 变为 0,0 变为 1。

假设你有两个位图 bitmap1bitmap2,并且已经设置了一些位:

复制代码
127.0.0.1:6379> SETBIT bitmap1 0 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap1 1 0
(integer) 0
127.0.0.1:6379> SETBIT bitmap1 2 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap1 3 1
(integer) 0


127.0.0.1:6379> SETBIT bitmap2 0 0
(integer) 0
127.0.0.1:6379> SETBIT bitmap2 1 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap2 2 1
(integer) 0
127.0.0.1:6379> SETBIT bitmap2 3 0
(integer) 0
  • bitmap1 的二进制表示是 00001011
  • bitmap2 的二进制表示是 00000110。

执行 BITOP AND 操作:

复制代码
127.0.0.1:6379> BITOP AND result_and bitmap1 bitmap2
(integer) 1
  • bitmap1 (00001011) AND bitmap2 (00000110) = 00000010
  • 结果 result_and 的二进制表示为 00000010

执行 BITOP OR 操作:

复制代码
127.0.0.1:6379> BITOP OR result_or bitmap1 bitmap2
(integer) 1
  • bitmap1 (00001011) OR bitmap2 (00000110) = 00001111
  • 结果 result_or 的二进制表示为 00001111

执行 BITOP XOR 操作:

复制代码
127.0.0.1:6379> BITOP XOR result_xor bitmap1 bitmap2
(integer) 1
  • bitmap1 (00001011) XOR bitmap2 (00000110) = 00001101
  • 结果 result_xor 的二进制表示为 00001101
2.5 BITPOS key bit start end

找到第一个被设置为 bit(0 或 1)的位的位置。可选参数 startend 用于指定搜索范围。

复制代码
127.0.0.1:6379> setbit bitmap 0 1
(integer) 0
127.0.0.1:6379> setbit bitmap 1 1
(integer) 0
127.0.0.1:6379> setbit bitmap 2 0
(integer) 0
127.0.0.1:6379> setbit bitmap 3 1
(integer) 0
127.0.0.1:6379> bitpos bitmap 0
(integer) 2
127.0.0.1:6379> bitpos bitmap 1
(integer) 0

更多命令请参考:Commands | Docs

3 使用场景

  • 用户在线状态

    • 可以用位图来记录用户的在线状态。例如,每天用一个位图表示所有用户的状态,其中每一位代表一个用户,1 表示在线,0 表示离线。
  • 日活跃用户统计

    • 通过位图可以记录每天的活跃用户。每一位代表一个用户,1 表示当天活跃,0 表示不活跃。然后可以通过 BITCOUNT 计算每天的活跃用户数。
  • 权限控制

    • 位图可以用来管理用户的权限。每一位可以代表一种权限,1 表示拥有该权限,0 表示没有。
  • 事件跟踪

    • 例如,在广告点击追踪中,可以用位图记录哪些用户点击了某个广告。每一位代表一个用户,1 表示点击过,0 表示没有点击。
  • 性能计数器

    • 位图可以用来实现高效的计数器。例如,记录每分钟的请求次数,每一位代表一秒钟,1 表示有请求,0 表示没有请求。
  • IP 地址黑名单/白名单

    • 位图可以用来存储 IP 地址黑名单或白名单。每一位代表一个 IP 地址,1 表示禁止访问,0 表示允许访问。
相关推荐
三8443 小时前
redis防御加固与安全基线
数据库·redis·安全·应急响应·防御
lhldsg3 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
SendTomo4 小时前
【技术交流】从0到1构建一个汉字学习平台:汉字吧(hanzi8.com)的技术架构猜想
redis·mysql·nginx·php·个人开发
IT大白鼠4 小时前
MySQL 分布式集群系列 · 第四篇——实操部署指南:从零搭建生产级 MySQL NDB 集群
数据库·分布式·mysql
IT大白鼠4 小时前
MySQL 分布式集群系列 · 第三篇——核心原理精讲:NDB 自动分片、多主写入与数据同步
数据库·分布式·mysql
Elastic 中国社区官方博客4 小时前
教程:使用 ES|QL 进行威胁狩猎
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·安全威胁分析
斑马1396 小时前
Linux软件编程学习笔记(十三)——数据库
数据库·oracle
初願致夕霞6 小时前
MySQL_索引
数据库·mysql
十六年开源服务商7 小时前
2026网站备份方案完整指南
数据库·oracle