Redis 数据类型Bitmaps(位图)

news/2024/10/18 21:47:35/

目录

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) 0127.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.ppmy.cn/news/1540097.html

相关文章

回头看以及向后看

回头看 昨天看了 大概一百个新生, 看到一百多个新生来了解python,一百多个人里有的可以根据给的相关教程很快的把ide和python解释器安装上,有的就出现了一堆一堆的问题,甚至有的连U盘都不知道怎么用,对着HDMI接口库库使…

闺蜜机为什么会火?

闺蜜机作为一种集娱乐、学习、健身等多功能于一体的家居设备,近年来逐渐受到消费者的青睐。以下是对闺蜜机的详细介绍: 一、定义与特点 定义:闺蜜机是一种屏幕尺寸介于18~32英寸之间、可触屏、自带支架且支持多个角度调节、底部自带滑轮可移…

apache pulsar 安装最新版本, docker安装pulsar3.3.2

1. 官网地址: Run a standalone Pulsar cluster in Docker | Apache Pulsar 2. 下载镜像: 2.1 选择镜像版本: https://hub.docker.com/r/apachepulsar/pulsar/tags 2.2 版本3.3.2 docker pull apachepulsar/pulsar:3.3.2 3. 安装&#xff…

hive on tez 指定队列后任务一直处于running状态

如上图所示一直处于running状态&#xff0c;查看日志发现一直重复弹出同一个info&#xff1a; 2024-10-18 16:57:32,739 [INFO] [AMRM Callback Handler Thread] |rm.YarnTaskSchedulerService|: Allocated: <memory:0, vCores:0> 释义: 当前应用程序没有分配到任何内存…

沥川的算法学习笔记:基础算法(1)----快速排序

1.快速排序 快速排序是一种高效的排序算法&#xff0c;它利用了分治的思想。快速排序的基本思想是选择一个基准元素&#xff0c;将数组分成两个子数组&#xff0c;其中一个子数组的元素都小于等于基准元素&#xff0c;另一个子数组的元素都大于等于基准元素&#xff0c;然后对这…

OpenCV高级图形用户界面(7)获取指定窗口的属性值函数getWindowProperty()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 提供窗口的参数。 函数 getWindowProperty 返回窗口的属性。 cv::getWindowProperty() 函数用于获取指定窗口的属性值。这个函数允许你查询窗口…

【学习笔记】什么是MongoDB

文章目录 MongoDB 简介体系结构数据模型MongoDB 的特点 MongoDB 简介 学习一个东西就跟认识一个人一样&#xff0c;下面有情MongoDB来做个自我介绍 大家好&#xff0c;俺是MongoDB&#xff0c;是一个开源、高性能、无模式的文档型数据库&#xff0c;当初的设计俺就是用于简化开…

JS逆向应该学习哪些基础知识?

JS逆向工程中&#xff0c;需要掌握的基础知识领域如下&#xff1a; ‌JavaScript基础‌&#xff1a; 变量、数据类型、运算符和表达式控制流语句&#xff08;如if-else、循环等&#xff09;函数和闭包对象和数组异步编程&#xff08;Promises、async/await&#xff09;DOM操作和…