Redis中的bitmap位图使用场景分析

举报
多米诺的古牌 发表于 2022/02/22 16:07:45 2022/02/22
【摘要】 1. 随机窗口的登录场景分析如果正常通过关系型数据库表进行存储信息,需要存储的信息最少有用户的id、用户名、用户的登录时间等等信息,一个用户365天登录了就会存365条信息,用户一多就会出现很大的存储需求。而使用Redis的bitmap位图进行存储操作就会非常节省空间,计算起来也非常便捷,比如下图的简单案例,tom在第1天、第13天、第365天进行了登录操作,通过setbit位操作将登录的天...

1. 随机窗口的登录场景分析

如果正常通过关系型数据库表进行存储信息,需要存储的信息最少有用户的id、用户名、用户的登录时间等等信息,一个用户365天登录了就会存365条信息,用户一多就会出现很大的存储需求。

而使用Redis的bitmap位图进行存储操作就会非常节省空间,计算起来也非常便捷,比如下图的简单案例,tom在第1天、第13天、第365天进行了登录操作,通过setbit位操作将登录的天数设置为位的索引位置,登录则设置值为1,此时查询tom登录了多少天就可以通过bitcount快速查询到结果为3,因为是二进制的操作所以查询速度会非常快速,最后我们看看总的消耗存储空间365天的登录信息只消耗了46个字节的存储

而进行随机窗口的取值,比如查看最后tom一个月的登录次数,如图所示,因为一个字节是8位,最后一个月30天,就是查看最后4个字节中值为1的情况,通过反向索引就是bitcount tom -4 -1最后四个字节的统计。

2.按照随机窗口进行活跃用户数统计分析

如果使用传统的关系型数据库表进行统计,首先需要存储最少有用户的id、用户名、用户的登录时间等等信息,然后再查出表的结果后需要进行去重操作,一个是会需要很大的存储,二一个是需要比较复杂的运算,结果会需要一定的时间。

如果通过Redis进行设计,只需要将日期存为key,再将用户都映射到位索引的地方(比如tom 是1号索引位,jack为12号索引位),如果登录了则设置值为1,如图所示,tom在20220101、20220102、20220103进行了登录,jack在20220102进行了登录,此时进行bitop的或运算,计算20220101和20220102之间登录的用户为活跃用户,因为或运算是有1则为1,而相同位置出现1会自动去重为1,而相同位置代表同一个人,此时就完成了用户的去重操作,而且因为是二进制进行运算,速度会非常快,按照随机窗口进行活跃用户数的统计会变得非常高效。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。