当前位置: 首页 > article >正文

Redis 数据类型Bitmaps(位图)

目录

1 基本特性

2 主要操作命令 

2.1 SETBIT key offset value

2.2 GETBIT key offset

2.3 BITCOUNT key [start] [end]

2.4 BITOP operation destkey key [key ...]

2.5 BITPOS key bit [start] [end]

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 的位的数量。可选参数 start 和 end 用于指定范围。

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 中。支持的操作包括 ANDORXOR 和 NOT

  • 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)的位的位置。可选参数 start 和 end 用于指定搜索范围。

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 表示允许访问。

http://www.kler.cn/news/355748.html

相关文章:

  • ES-入门-javaApi-文档-新增-删除
  • 【芙丽芳丝净润洗面霜和雅漾舒护活泉喷雾
  • AnaTraf | TCP重传的工作原理与优化方法
  • 【数据分享】1901-2023年我国省市县三级逐月最低气温(免费获取/Shp/Excel格式)
  • 详解tcpdump
  • (4) cuda cudnn TensorRT安装及配置
  • Qt(信号槽)
  • 等保测评与网络安全应急响应
  • uni-app 实现好看易用的抽屉效果
  • 实时计算Flink应用场景
  • PMP--必刷题–解题–161-172
  • python编程:常用模块分类整理
  • 打包使用pythn编写的maya插件,使用pyeal打包
  • Karmada核心概念
  • beyond compare 这个授权密钥已被吊销
  • Lucene 倒排索引
  • 5.深度学习计算
  • 【MR开发】在Pico设备上接入MRTK3(二)——在Unity中配置Pico SDK
  • 利用Arcgis进行沟道形态分析
  • maven工程怎么将除工程源码外的三方依赖一起打包到jar中