签到功能---BitMap

文章目录

需求分析以及接口设计

2.1.思路分析

之前我们设计了签到功能对应的数据库表:

 

CREATE TABLE `sign_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `user_id` bigint NOT NULL COMMENT '用户id', `year` year NOT NULL COMMENT '签到年份', `month` tinyint NOT NULL COMMENT '签到月份', `date` date NOT NULL COMMENT '签到日期', `is_backup` bit(1) NOT NULL COMMENT '是否补签', PRIMARY KEY (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='签到记录表';

这张表中的一条记录是一个用户一次的签到记录。假如一个用户1年签到100次,而网站有100万用户,就会产生1亿条记录。

随着用户量增多、时间的推移,这张表中的数据只会越来越多,占用的空间也会越来越大。

我们知道二进制是计算机底层最基础的存储方式了,其中的每一位数字就是计算机信息量的最小单位了,称之为bit,一个月最多也就 31 天,因此一个月的签到记录最多也就使用 31 bit 就能保存了,还不到 4 个字节。

而如果用到我们前面讲的数据库方式来保存相同数据,则要使用数百字节,是这种方式的上百倍都不止。

可见,这种用二进制位保存签到记录的方式,是不是非常高效啊!

像这种把每一个二进制位,与某些业务数据一一映射(本例中是与一个月的每一天映射),然后用二进制位上的数字0和1来标识业务状态的思路,称为位图。也叫做BitMap.

这种数据统计的方式非常节省空间,因此经常用来做各种数据统计。比如大名鼎鼎的布隆过滤器就是基于BitMap来实现的。

OK,那么利用BitMap我们就能直接实现签到功能,并且非常节省内存,还很高效。所以就无需通过数据库来操作了。

那么BitMap该怎么使用呢?

 

技术细节

BitMap用法

例如,修改某个bit位上的数据:

  • offset:要修改第几个bit位的数据

  • value:0或1

  • 最终Redis中保存的效果:

读取BitMap中的数据,可以用这个命令:

 

BITFIELD key GET encoding offset

  • key:就是BitMap的key

  • GET:代表查询

  • encoding:返回结果的编码方式,BitMap中是二进制保存,而返回结果会转为10进制,但需要一个转换规则,也就是这里的编码方式

    • u:无符号整数,例如 u2,代表读2个bit位,转为无符号整数返回

    • i:又符号整数,例如 i2,代表读2个bit位,转为有符号整数返回

  • offset:从第几个bit位开始读取,例如0:代表从第一个bit位开始

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值