Redis特殊数据类型Bitmap详解

    科技2024-07-25  65

    5.3.1 位图场景简介

    类似于Java中的位运算,是按位来进行存储的

    基于实际场景理解:

    我们正常要存一个对象,比如user,如果筛选用户是最快的这时候我们就可以用0101来代表

    1.比如疫情要统计感染人数:

    全中国有14亿人,我们可以使用14亿个0把数据存起来,如果有感染就把0变为1

    2.网站后台统计用户信息,分为活跃与不活跃

    3.网站用户显示登录状态,登录与未登录

    4.用户打卡状态:

    如果要在Java中做,就需要设计数据表,存放user的信息与status

    但是如果使用redis中的bitmaps,就可以利用

    String与bitmaps的配合

    set user:1:name xxx user1:status: 0 set user:2:name xxx user2:status: 0

    使用string存储用户信息,属性status存储位,

    但是!还有一种更简单的方式,直接使用Bitmaps位图进行操作,它也是一种数据结构,二进制存储,非0即1

    比如存储一个用户一年状态,365天=365bit 1字节=8bit 大概只需要46个字节左右就足够了!


    5.3.2 setbit 命令使用详解

    setbit key offset value

    offset可以理解为空闲的位置或者Index

    ##使用bitmap可以记录一周的打卡状态 ##最后我想要知道一周的打卡次数 ##只需要判断它的位是1的,然后统计输出就行 127.0.0.1:6379> setbit sign 0 0 (integer) 0 127.0.0.1:6379> setbit sign 1 1 (integer) 0 127.0.0.1:6379> setbit sign 2 0 (integer) 0 127.0.0.1:6379> setbit sign 3 1 (integer) 0 127.0.0.1:6379> setbit sign 4 0 (integer) 0 127.0.0.1:6379> setbit sign 5 1 (integer) 0 127.0.0.1:6379> setbit sign 6 0 (integer) 0 127.0.0.1:6379>

    5.3.3 getbit 命令详解

    getbit key offset

    127.0.0.1:6379> setbit sign 0 0 (integer) 0 127.0.0.1:6379> setbit sign 1 1 (integer) 0 127.0.0.1:6379> setbit sign 2 0 (integer) 0 127.0.0.1:6379> setbit sign 3 1 (integer) 0 127.0.0.1:6379> setbit sign 4 0 (integer) 0 127.0.0.1:6379> setbit sign 5 1 (integer) 0 127.0.0.1:6379> setbit sign 6 0 (integer) 0 ##获取某一天的打卡状态 ##getbit命令 127.0.0.1:6379> getbit sign 1 (integer) 1 127.0.0.1:6379> getbit sign 2 (integer) 0 127.0.0.1:6379> getbit sign 3 (integer) 1 127.0.0.1:6379>

    5.3.4 bitcount 命令详解

    bitcount key start end

    127.0.0.1:6379> setbit sign 0 0 (integer) 0 127.0.0.1:6379> setbit sign 1 1 (integer) 0 127.0.0.1:6379> setbit sign 2 0 (integer) 0 127.0.0.1:6379> setbit sign 3 1 (integer) 0 127.0.0.1:6379> setbit sign 4 0 (integer) 0 127.0.0.1:6379> setbit sign 5 1 (integer) 0 127.0.0.1:6379> setbit sign 6 0 (integer) 0 127.0.0.1:6379> getbit sign 1 (integer) 1 127.0.0.1:6379> getbit sign 2 (integer) 0 127.0.0.1:6379> getbit sign 3 (integer) 1 ##统计打卡天数 127.0.0.1:6379> bitcount sign 0 -1 (integer) 3 ##统计打卡天数 127.0.0.1:6379> bitcount sign (integer) 3 127.0.0.1:6379>
    Processed: 0.009, SQL: 8