首页 > 数据库 >【≅Redis】BitMap类型介绍

【≅Redis】BitMap类型介绍

时间:2023-05-20 22:12:07浏览次数:50  
标签:签到 Redis BitMap key 类型 bit Bitmap 二值

BitMap(2.2 版新增)

Bitmap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行0|1的设置,表示某个元素的值或者状态,时间复杂度为O(1)。

由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。

内部实现

Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。

String 类型是会保存为二进制的字节数组,所以,Redis 就把字节数组的每个 bit 位利用起来,用来表示一个元素的二值状态,你可以把 Bitmap 看作是一个 bit 数组。

常用命令

bitmap 基本操作:

# 设置值,其中value只能是 0 和 1
SETBIT key offset value

# 获取值
GETBIT key offset

# 获取指定范围内值为 1 的个数
# start 和 end 以字节为单位
BITCOUNT key start end

bitmap 运算操作:

# BitMap间的运算
# operations 位移操作符,枚举值
  AND 与运算 &
  OR 或运算 |
  XOR 异或 ^
  NOT 取反 ~
# result 计算的结果,会存储在该key中
# key1 … keyn 参与运算的key,可以有多个,空格分割,not运算只能一个key
# 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等。
BITOP [operations] [result] [key1] [keyn…]

# 返回指定key中第一次出现指定value(0/1)的位置
BITPOS [key] [value]

应用场景

Bitmap 类型非常适合二值状态统计的场景,这里的二值状态就是指集合元素的取值就只有 0 和 1 两种,在记录海量数据时,Bitmap 能够有效地节省内存空间。

签到统计

在签到打卡的场景中,我们只用记录签到(1)或未签到(0),所以它就是非常典型的二值状态。

签到统计时,每个用户一天的签到用 1 个 bit 位就能表示,一个月(假设是 31 天)的签到情况用 31 个 bit 位就可以,而一年的签到也只需要用 365 个 bit 位,根本不用太复杂的集合类型。

假设我们要统计 ID 100 的用户在 2022 年 6 月份的签到情况,就可以按照下面的步骤进行操作。

第一步,执行下面的命令,记录该用户 6 月 3 号已签到。

SETBIT uid:sign:100:202206 2 1

第二步,检查该用户 6 月 3 日是否签到。 

GETBIT uid:sign:100:202206 2 

 

标签:签到,Redis,BitMap,key,类型,bit,Bitmap,二值
From: https://www.cnblogs.com/xfeiyun/p/17417899.html

相关文章

  • Redis笔记(四):Java集成和配置
    JedisJedis是Redis官方提供的Java客户端,用于在Java应用程序中连接、操作Redis,它提供了与Redis通信的API,简化了Java开发者与Redis的交互流程。JedisGithubReadme:https://github.com/redis/jedis#getting-startedSpringBoot在SpringBoot2.x之后,原来使用的jedis被替换成了lettc......
  • java引用类型传值
    引用类型参数的传递,调用方的变量,和接收方的参数变量,地址指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方myself:这样也不用像php加&,说变就跟着变,会不会很麻烦,出现一些隐匿的bugpublicclassImoocStudent{publicvoidreplaceFirstPlayer(String......
  • 函数传参类型为数组时,int*和char*的区别
    1.现象(1)假设有一个int型数组,我们先用int*给函数传参#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>voidtest(int*arr){ arr[1]=8;}intmain(){ intarr[]={7,3,4,6,8,9,1,5,2,10};test(arr); printf("%d\n",arr[0]); printf("%d",arr......
  • springboot整合redis
     前言Redis是一款key-value存储结构的内存级NoSQL数据库支持多种数据存储格式支持持久化支持集群Redis下载(Windows版)https://github.com/tporadowski/redis/releasesRedis安装与启动(Windows版)Windows解压安装或一键式安装服务端启动命令redis-server.exe......
  • c和c++各种类型数据左移溢出对比
    cint:1#include<stdio.h>2main(){3//int4intj=1;//<<31==21474836485//1<<32==16//(1<<32)-1==07//(1<<32)-2==42949672958for(inti=30;i<(1<<5)+1;i......
  • instanceof和类型转换
    instanceof和类型转换instanceofpackageoop.demo01.demo06;publicclassPerson{}packageoop.demo01.demo06;publicclassTeacher{}packageoop.demo01.demo06;publicclassStudentextendsPerson{}packageoop.demo01.demo06;publicclassApplicat......
  • APP-PER-5002: Oracle 人力资源管理系统无法检索用户类型配置文件选项的值。
    打开设置“职位层次结构"窗体时提示错误:APP-PER-5002:Oracle 人力资源管理系统无法检索用户类型配置文件选项的值。请确保为您的责任正确设置此值。解决方式:为该职责(例如职责全称:PO_超级管理员(CUX)) 设置配置文件(路径:SYSTEMADMINISTRATOR>> 配置文件>>系统。)。 ......
  • 软构学习-5、6-设计规约、抽象数据类型(ADT)
    目录5设计规约行为等价性Spec结构Spec强度比较Diagrammingspecifications6抽象数据类型(ADT)操作的抽象类型分类:RepresentationIndependence5设计规约本章大纲:方法的规约前置/后置条件欠定规约、非确定规约陈述式、操作式规约规约强度及其比较如何写出好的规约......
  • redis实现生成自增编码两种方式
    redis实现生成自增编码两种方式文章目录 https://blog.csdn.net/MS_SONG/article/details/130226992方式一方式二生成编码时处理并发+事务实际场景 思路:都是从缓存中取,取出来+1再放入缓存,以便下次取用区别:方式一,手动+1;方式二:利用redis.increment实现自增;提示:写......
  • 经常搞不清楚的几个数据类型
    1、什么是浮点数?之前我们学习了定点数,其中「定点」指的是约定小数点位置固定不变。那浮点数的「浮点」就是指,其小数点的位置是可以是漂浮不定的。这怎么理解呢?其实,浮点数是采用科学计数法的方式来表示的,例如十进制小数8.345,用科学计数法表示,可以有多种方式:8.345=8.345*1......