侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Redis数据类型-bitmap

再见理想
2022-05-27 / 0 评论 / 0 点赞 / 349 阅读 / 997 字

一,简介

“a” ASCll码是97,二进制是0110 0001,每个数“1”,“0”叫做位(bit),每8位叫做一个字节(byte),偏移量从左到右,从1到(二进制总数-1)。

Bitmap 是一串连续的二进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR以及其它位操作,实现大数据统计日活跃用户、避免重复点赞等。

二,原理

8bit = 1b = 0.001kb。bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值,只能是0或1。

三,优势

1,极省空间,官网公式($offset/8/1024/1024)MB,假设有2亿用户,需要花200000000/8/1024/1024 = 24M即可;
2,效率极高,setbit和getbit的时间复杂度就是O(1),其他位运算也是效率极高的;

限制
1,位计算和位表示数值的局限;
2,redis 中 bit 映射被限制在 512MB 之内,所以最大是 2^32 位。建议每个key的位数都控制下,因为读取时候时间复杂度 O(n),越大的串读的时间花销越多。

四,使用场景

1,用户在线状态
使用 bitmap 是一个节约空间效率又高的一种方法,只需要一个 key,然后用户id为偏移量 offset,如果在线就设置为1,不在线就设置为0,3亿用户只需要36MB的空间。

2,统计活跃用户
使用时间作为缓存的 key,然后用户 id 为 offset,如果当日活跃过就设置为1。之后通过 bitOp 进行二进制计算算出在某段时间内用户的活跃情况。

3,用户签到
用户需要进行签到,对于签到的数据需要进行分析与相应的运运营策略。使用 redis 的 bitmap,由于是长尾的记录,所以 key 主要由 uid 组成,设定一个初始时间,往后没加一天即对应 value 中的 offse t的位置。

五,命令

1,对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),位的设置或清除取决于 value 参数,可以是 0 也可以是 1,当 key 不存在时,自动生成一个新的字符串值;

offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内),时间复杂度O(1),返回原偏移量的位。

SETBIT key offset value

2,计算给定字符串中,被设置为 1 的比特位的数量,指定额外的 start 或 end 参数,可以让计数只在特定的位上进行,可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推,时间复杂度O(N),返回被设置为 1 的位的数量。

可用于大数据签到、重复点赞、订单重复评论等。

BITCOUNT key [start] [end]

3,对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。

BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数。可用于**统计活跃用户**:

使用时间作为 cacheKey,然后用户 ID 为 offset,如果当日活跃过就设置为 1。那么我该如果计算某几天/月/年的活跃用户呢(暂且约定,统计时间内只有有一天在线就称为活跃)

BITOP operation destkey key [key ...]
0

评论区