• 三、Redis新类型之 bitmap


    一、基础知识

    1、概念

    说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型
    位图(bitmap)本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们可以称之为一个索引或者位格)。Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多大42.9亿的字节信息(2^32 = 4294967296)

    一句话总结:bitmap是由0和1状态表现的二进制位的bit数组。常用于二值统计。

    2、优缺点

    优点

    • 精确计算,结果准确,结果只有0/1。
    • 亿级数据的收集和统计,存的进+取得快+多统计。
    • 节省存储空间,统计一亿位的Bitmap约占12MB的内存,内存开销低,。(如果这些数据存在mysql中?)

    缺点

    • 数据量过大的场景,一亿位的Bitmap约占12MB,十亿就是120MB,百亿就是1GB。

    3、使用场景

    (1)用于状态统计:Y、N,类似AtomicBoolean。

    (2)钉钉打卡上下班,签到统计。

    (3)日活统计。

    (4)某用户按照一年365天,哪几天登陆过?哪几天没有登陆?全年中登录的天数共计多少?

    (5)电影、广告是否被点击播放过

     

    二、常见命令

    bitmap底层是String,可以用get命令得到二进制的ascii编码

     

    1、setbit

    setbit key offset value

    key——键

    offset——偏移位(Bitmap的偏移位是从0开始算的

    value——值(只能是0和1

    例:

    2022年1月18日签到,setbit sign:userId:202201 18 1

    2、getbit

    getbit key offset

    3、bitcount

    bitcount key,用于统计全部键里面含有1的有多少个。

    常见场景:统计签到次数。

    4、strlen

    strlen key,用于统计字节长度。不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容

    例:

     5、bitop

    BITOP operation destkey key [key ...],对一个或多个 key 进行位元操作,并将结果保存到 destkey 上(destkey可自定义)

    常见场景:查询连续签到的用户

    operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:

    • BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
    • BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
    • BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
    • BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey 
    redis> SETBIT k1 0 1        # k1 = 1001
    (integer) 0
    
    redis> SETBIT k1 3 1
    (integer) 0
    
    redis> SETBIT k2 0 1        # k2 = 1011
    (integer) 0
    
    redis> SETBIT k2 1 1
    (integer) 0
    
    redis> SETBIT k2 3 1
    (integer) 0
    
    redis> BITOP AND and-result k1 k2
    (integer) 1
    
    redis> GETBIT and-result 0      # and-result = 1001
    (integer) 1
    
    redis> GETBIT and-result 1
    (integer) 0
    
    redis> GETBIT and-result 2
    (integer) 0
    
    redis> GETBIT and-result 3
    (integer) 1
  • 相关阅读:
    一种可以实时检测IP地址合法性的EditText输入框
    LVDS 屏幕 M215HGE-L21 在 rk3288 上的适配过程
    轻读一下 Android 应用开发中的 assets 目录
    XML与其在Android下的解析
    Linux Shell脚本实现根据进程名杀死进程
    RSA host key has changed 错误
    Linux下安装jdk8步骤详述
    Windows/Linux javac/java编译运行引入所需的jar包
    No cached version of ..... available for offline mode.
    Java学习之InputStream中read()与read(byte[] b)
  • 原文地址:https://www.cnblogs.com/shiblog/p/15817827.html
Copyright © 2020-2023  润新知