• Redis的数据结构之bitmap


    背景

    项目开发过程中,我们经常会使用boolean类型来存储数据。例如记录用户每天签到,签到了是1,没签则为0,如果我们需要统计一年内的签到数,如果采用String来存储,需要每个用户都要记录 365次,当用户数量非常大时,需要的存储空间非常巨大。为了解决这个问题,Redis提供了位图数据结构来解决此问题。

    简介

    bitmap简称位图,是由多个二进制位组成的数组,数组中的每个二进制位都有与之对应的偏移量,可以通过这些偏移量对位图中指定的一个或多个二进制位进行操作。

    数据结构

    说明:位图也可以看作一个字节数组,索引序号代表对应的值,bitmap默认值都为0

    基础命令

    setbit 设置二进制位的值

    基本语法

    setbit key offset value
    

    注意:设置bit值时,其中offset的值不能为负数,否则会报ERR bit offset is not integer or out of range错误。

    示例说明

    将位图mbit设置为:10010100

    1. #设置第一个位置为1
    2. setbit mbit 0 1
    3. #设置第四个位置为1
    4. setbit mbit 3 1
    5. #设置第六个位置为1
    6. setbit mbit 5 1

    位图的变化过程

    位图的扩展

    当用户执行setbit命令时,如果位图不存在,或者位图当前的大小无法满足用户想要执行的设置操作,那么Redis将对被设置的位图进行扩展,使得位图可以满足用户的设置请求。

    例如用户执行如下命令:

    setbit mbit 10 1
    

    Redis创建出的位图并不是只有11个二进制位,而是有两个字节共16个二进制位,如下图所示。

    说明:从个图我们也可以看到,除了偏移量为10的二进制位之外,其他所有未被设置的二进制位都被初始化成了0。

    getbit 获取二进制位的值

    基本语法

    getbit key offset
    

    示例

    bitcount 统计被设置的二进制位数量

    基本语法

    bitcount key start end
    

    示例

    bitop 对一个或多个保存二进制位的字符串 key 进行位元操作

    基本语法

    bitop and key1 key2
    

    说明: bitop 命令支持 and、or、not、xor这四种操作

    • and: 与运算符(&) 两个同时为1,结果为1,否则为0
    • or: 或运算(|) 一个为1,其值为1
    • not: 取反(0110 0001 NOT: 1001 1110)
    • xor: 异或运算,值不同为1,否则为0

    示例

    bitpos 用来查找指定范围内出现的第一个 0 或 1 (字节为单位)

    基本语法

    bitpos key start end
    

    示例

    应用场景

    • 1.用户签到次数

    1 代表签到,0 代表未签到,这样可以很轻松地统计出用户的活跃程度。相比于直接使用字符串而言,位图中的每一条记录仅占用一个bit位,从而大大降低了内存空间使用率。

    2.统计登录次数

    总结

    本文讲解了位图的基本数据结构和操作命令,位图适合于一些特定的场景,我们需要集合实际的业务场景情况,选择合适的数据结构存储能够大大的降低Redis的内存空间。

  • 相关阅读:
    LeetCode刷题系列 -- 652. 寻找重复的子树
    深度思考:ThreadLocal是否存在内存泄漏问题,如何防止内存泄漏?
    2022年,真的是90%岗位需要自动化测试?
    c# 类的介绍及延伸
    为什么Proteus串口无法正常显示
    模板方法模式
    简述 Mybatis 的插件运行原理,如何编写⼀个插件
    memcpy和memmove函数的介绍和模拟实现
    leetcode笔记
    学习笔记-域
  • 原文地址:https://blog.csdn.net/Firstlucky77/article/details/125446515