一、需求背景
首先,我们来看一下需求:网站统计用户登录的次数,具体如下:
- 网站有1亿个用户,有经常登录的,也有不经常登录的
- 如何来记录用户的登录信息
- 如何查询活跃用户:比如:一周内,登录3次的
二、使用传统的关系型数据库
我们使用传统的关系型数据库(比如:Oracle)来存储这样的数据,如下图所示。
每周产生7亿条数据,对于任何一个关系型数据库来说,都是非常不好维护的,对性能也会有很大的影响。
三、使用Redis的setbit操作
Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。如下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。(如果你的uid不是从1开始的,比如从100000开始,实际上你也可以相应的用uid减去初始值来表示其位数,比如1000000用户对应到bitmap的第一位)
具体的代码类似下面这样:
这样一次记录的复杂度是O(1),在Redis中速度非常快。
redis.setbit(key, user_id, 1)
下面代码是在Redis CLI中执行的Demo演示,比如:用户ID为100的用户在星期一登录了网站,我们就通过setbit操作,把星期一对应的100位的值置为1,
127.0.0.1:6379> setbit monday 100 1 (integer) 0
而我们通过每天换用一个不同的key来将每天的活跃用户状态记录分开存。并且可以通过一些与或运算计算出N天活跃用户,和连接N天活跃用户这样的统计数据。
如下图,第一行表示星期一的活跃用户情况,第二行表示周二的,以此类推。为样我们通过对N天的活跃用户记录取并集操作,就能得出在N天内活跃过的用户列表。
相关推荐
传智播客 赵强老师的Oracle课件 很实用 对于学习很有帮助
想要好好地学习Oracle数据库的朋友呀,你错过了她就太不值得了。里面有好多的Oracle操作命令可能你都没接触过吧。好了,话不多多说。坚信资料不错!你,值得拥有!OK.还有,之所有要你2分打赏,是我给了你这么好的...
精通JSP编程 作者赵强 ISBN号7121022893 3-11章节
精通JSP编程 作者赵强 编 12-18节
1.1 主要平台首页用户浏览动机比较 1.2 用户浏览微信购物首页的痛点 1.3 不同平台用户痛点比较 1.4 用户在微信购物首页的内容需求 1.1 用户分群
[1120][赵强精通JSP编程][37M],提供下载地址,经典的资料,书籍,绝对经典!
资料为2013 10份上课学习整理,对于初学者比较有用
教程名称:Oracle 数据库赵强视频教程【3天】教程目录:【】Oracle安装与管理、SQL语句(赵强)【】Orcale存储过程jdbc与Orcale大文本操作等(赵强)【】SQL简单查询触发器视图(赵强) 资源太大,传百度网盘了,链接在...
信息存储技术的发展赵强.doc
10天掌握MongoDB(2012翻新完整版),网上牛人整理的,我添加了书签,入门必备。
二年级数学生活中的大数赵强PPT课件.pptx
mongodb 安装 及分配配置 以及使用中遇到的情况
二年级数学生活中的大数赵强PPT学习教案.pptx
day2013-0110-webLogic配置和集群(赵强).zip,视频和文档齐全
LoadRunner性能测试巧匠训练营-完整版(带目录)-赵强邹伟伟无密码,解压就可看
如何构建后现代前端工程化开发体系.pdf 接口联调 • 需求:定义数据结构 +假数据测试 + 记录接口文档 • 推荐:postman ...• 本地服务:steamer-plugin-...• 产品:百度统计 or 腾讯统计 • 性能:wetest • 报错:sentry.io
游戏运营手册.pdf,赵强著,游戏运营,策划,游戏运营手册.pdf,赵强著,游戏运营,策划
java代码-46 赖赵强