[Redis小知识]从业务角度分析一下BitMap的作用

提示:今天和大家分享bitmap的知识

文章目录

  • 前言
  • 一、日常使用Bitmap的业务
  • 二、bitmap使用逻辑
    • 1.bitmap简介
    • 2.bitmap基础指令
    • setbit的指令
    • getbit 获取操作
    • bitcount 统计操作
  • 总结


前言

BitMap Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。`


[Redis小知识]从业务角度分析一下BitMap的作用_第1张图片

一、日常使用Bitmap的业务

示例:在开发中,可能会遇到这种情况:需要统计用户的某些信息,如活跃或不活跃,登录或者不登录;又如需要记录用户一年的打卡情况,打卡了是1, 没有打卡是0,如果使用普通的 key/value存储,则要记录365条记录,如果用户量很大,需要的空间也会很大,因此有没有一种优化的方案呢?

二、bitmap使用逻辑

1.bitmap简介

所以 Redis 提供了 Bitmap 位图这中数据结构
Bitmap 就是通过操作二进制位来进行记录,即为 0 和 1;如果要记录 365 天的打卡情况,使用 Bitmap表示的形式大概如下:0101000111000111…,这样有什么好处呢?
[Redis小知识]从业务角度分析一下BitMap的作用_第2张图片

当然就是节约内存了,365 天相当于 365 bit,又 1 字节 = 8 bit , 所以相当于使用 46 个字节即可。

BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。Redis 从 2.2 版本之后新增了setbit, getbit, bitcount 等几个bitmap 相关命令。

2.bitmap基础指令

setbit的指令

代码如下(示例):SETBIT key offset value : 设置 key 第 offset 位为value (1或0)

# 使用 bitmap 来记录上述事例中一周的打卡记录如下所示:
# 周一:1,周二:0,周三:0,周四:1,周五:1,周六:0,周天:0 (1 为打卡,0 为不打卡) 
127.0.0.1:6379> setbit sign 0 1 
0
127.0.0.1:6379> setbit sign 1 0 
0
127.0.0.1:6379> setbit sign 2 0 
0
127.0.0.1:6379> setbit sign 3 1 
0
127.0.0.1:6379> setbit sign 4 1 
0
127.0.0.1:6379> setbit sign 5 0 
0
127.0.0.1:6379> setbit sign 6 0 
0

getbit 获取操作

GETBIT key offset 获取offset设置的值,未设置过默认返回0

127.0.0.1:6379> getbit sign 3 # 查看周四是否打卡 
1
127.0.0.1:6379> getbit sign 6 # 查看周七是否打卡
0

bitcount 统计操作

bitcount key [start, end] 统计 key 上位为1的个数

# 统计这周打卡的记录,可以看到只有3天是打卡的状态: 
127.0.0.1:6379> bitcount sign 
3

总结

优点:
1. bitmap运算效率高,数据只有0和1,不涉及比较和移位;
2. 占用内存少
缺点:
1. 所有的数据不能重复,即不可对重复的数据进行排序
2. 当数据类似(1,1000,10万)只有3个数据的时候,用bitmap时间复杂度和空间复杂度相当大,只有当数据比较密集时才有优势。
[Redis小知识]从业务角度分析一下BitMap的作用_第3张图片

你可能感兴趣的:(nosql,数据库,redis)