文章目录
需求分析以及接口设计
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位开始


922

被折叠的 条评论
为什么被折叠?



