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 表示允许访问。
相关推荐
远歌已逝1 小时前
维护在线重做日志(二)
数据库·oracle
只因在人海中多看了你一眼1 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
qq_433099402 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz2 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺4 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i6 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl6 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502776 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空6 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse