redis位图bitmap
一句话:由0和1状态表现的二进制位的bit数组
看需求:
1.用户是否登录过Y、N,比如京东每日签到送京豆。
2.电影、广告是否被点击播放过。
3.钉钉打卡上下班,签到统计。
是什么:
BIT arrays(or simply bitmaps, 我们可以称之为位图)
0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
---|
一个字节(一个byte)=8位
说明: 用String类型作为底层数据结构实现的一种统计二值状态的数据类型
位图本质是数组,它是基于String 数据类型的按位的操作。该数组由多个二进制组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。
Bitmap支持的最大位数是232位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(232 = 4294967296)
能干嘛
用于状态统计
Y、N,类似AtomicBoolean
基本命令
命令 | 作用 | 时间复杂度 |
---|---|---|
setbit key offset val | 给指定key的值第offset赋值val | O(1) |
getbit key offset | 获取指定key的第offset位 | O(1) |
bitcount key start end | 返回指定key中[start,end]中为1的数量 | O(n) |
bitop operation destkey eky | 对不同的二进制存储数据进行位运算(AND、OR、NOT、XOR) | O(n) |
setbit
用法:setbit key offset val
set 键 偏移位 只能零或者1
Bitmap的偏移量是从零开始算的
示例:
127.0.0.1:6379> SETBIT k1 1 1
(integer) 0
getbit
用法: getbit key offset
示例:
127.0.0.1:6379>GETBIT k1 0
(integer) 0
strlen
统计字节数占用多少
bitcount
全部键里面含有1的有多少个
127.0.0.1:6379> SETBIT uid:login123 1 1
(integer) 0
127.0.0.1:6379> SETBIT uid:login123 2 1
(integer) 0
127.0.0.1:6379> SETBIT uid:login123 3 1
(integer) 0
127.0.0.1:6379> BITCOUNT uid:login123
(integer) 3
bitop
bitop operation destkey key
应用场景
一年365天,全年天天登录占用多少字节
按年去存储一个用户的签到情况,365天只需要365/8 ≈ 46Byte , 1000w用户量一年也只需要44MB就足够了。
假如是亿级的系统,
每天使用1个1亿位的Bitmap约占12MB的内存(10^8/8/1024/1024), 10天的Bitmap的内存开销约120MB,内存压力不算太高。
此外,在实际使用时, 最好对Bitmap设置过期时间,让Redis自动删除不在需要的签到记录以节省内存开销。