一、应用

Redis7 10大数据类型(Redis位图)_数据类型

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

用于状态统计,Y、N类似AtomicBoolean

Redis7 10大数据类型(Redis位图)_应用场景_02

应用场景
用户是否登陆过Y、N,每日签到
电影、广告是否被点击播放过
打卡上下班,签到统计

二、由0和1状态表现的二进制位的bit数组

三、案例

setbit

setbit key offset value 

setbit键 偏位移 只能0或者1
Bitmap的偏移量是从零开始算的

Redis7 10大数据类型(Redis位图)_数据类型_03

getbit

getbit key offset

strlen

Redis7 10大数据类型(Redis位图)_应用场景_04

统计字节数占用多少

bitcount

全部键里面含有1的有多少个

Redis7 10大数据类型(Redis位图)_数据类型_05

bitop

连续2天都签到的用户
加入某个网站或者系统,它的用户有1000W,做个用户id和位置的映射
比如0号位对应用户id:uid-092iok-lkj
比如1号位对应用户id:uid-7388c-xxx

Redis7 10大数据类型(Redis位图)_应用场景_06

setbit和getbit案例说明

按照天

Redis7 10大数据类型(Redis位图)_应用场景_07

应用场景

一年365天,全年天天登录占用几个字节

Redis7 10大数据类型(Redis位图)_数组_08

按照年

按年去存储一个用户的签到情况,365 天只需要 365 / 8 ≈ 46 Byte,1000W 用户量一年也只需要 44 MB 就足够了。

假如是亿级的系统,
每天使用1个1亿位的Bitmap约占12MB的内存(10^8/8/1024/1024),10天的Bitmap的内存开销约为120MB,内存压力不算太高。
此外,在实际使用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录以节省内存开销。