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 表示允许访问。
相关推荐
Hacker_LaoYi1 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀1 小时前
Redis梳理
数据库·redis·缓存
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天1 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain3 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship3 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站3 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle