使用Redis做产品统计的两种模式
http://zihua.li/2012/07/two-patterns-of-statistics-using-redis/
产品运行过程中及时记录收集并分析统计数据对产品的持续改进有重要的指导作用。其中有两个很常见的统计模式:每小时新增的用户数量和一周内活跃的用户(对于一个漂流瓶应用,可能是每天都扔瓶子或捞瓶子的用户)数量。在实际开发中我使用 Redis 来实现这两个模式。
每小时新增用户数量
每小时新增的用户数量可以用 Redis 的 Hashes 数据类型来实现。Key 名为日期的 yymmdd 表示法,Field 名为小时数,取值范围是 0-23,Field 的值即为该天该小时的新用户数量。例如当2012年7月14日21点有新用户注册时,只要执行“HINCRBY 120714 21 1”即可。 存储结构如下图所示:
这种存储方式不仅存储读取都很方便,而且直观,很容易就能实现统计从某天某小时到某天某小时总的新用户数量。
一周内活跃的用户
统计活跃用户必须给每个用户一个表示其当天是否活跃的布尔标记,可想而知如果用户数很多的话,其占用的存储空间会很大。这时我们可以借助 Redis 的 Bit 数据类型(准确讲就是 String 数据类型)的 SETBIT 接口,该接口可以在 Redis 里实现按位存储,空间利用率极高。使用这种方法的前提是每个用户需要有一个自增的 ID,假如 ID 为 3 的人在2012年7月14日活跃过了,则执行“SETBIT activeusers:120714 3 1”即可,此时该 Key 的二进制存储情况为:
activeusers:120714 0001
同理如果 ID 为 12 的用户在同日活跃过了,标记后该 Key 的二进制存储情况为:
activeusers:120714 0001000000001
那么如果想计算一周内持续活跃的用户该怎么办呢?很简单,只要把一周的数据做 AND 操作即可。至于计算一周内活跃过的用户或一周内一天都没活跃过的用户则仅仅更换布尔运算符即可实现。
本来这篇日志我着重想讲在 Node.js 中如何处理通过 Redis 的 GET 接口获得的二进制数据(因为在Node.js没有直接操作此类数据的方法<char_group class="biaodian cjk">),不过写日志时看了下 Redis 的文档,竟然发现了 Redis 2.6 中新增加了 BITCOUNT 和BITOP 两个接口,前者可以获得 Key 中的 Bit 数(即当天活跃用户数<char_group class="biaodian cjk">),后者可以实现 Key 的 AND, OR, NOT, XOR 操作。不过令人欣慰的是截至目前 Redis 最新稳定版本仍然是 2.4.15(我这是什么心态啊<char_group class="biaodian cjk">)。
使用Redis做产品统计的两种模式的更多相关文章
- Flink on Yarn的两种模式及HA
转自:https://blog.csdn.net/a_drjiaoda/article/details/88203323 Flink on Yarn模式部署始末:Flink的Standalone和on ...
- 【转】Reactor与Proactor两种模式区别
转自:http://www.cnblogs.com/cbscan/articles/2107494.html 两种IO多路复用方案:Reactor and Proactor 一般情况下,I/O 复用机 ...
- ACE_linux:Reactor与Proactor两种模式的区别
一.概念: Reactor与Proactor两种模式的区别.这里我们只关注read操作,因为write操作也是差不多的.下面是Reactor的做法: 某个事件处理器宣称它对某个socket上的读事件很 ...
- JSP中两种模式的总结
运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...
- Spark On Yarn的两种模式yarn-cluster和yarn-client深度剖析
Spark On Yarn的优势 每个Spark executor作为一个YARN容器(container)运行.Spark可以使得多个Tasks在同一个容器(container)里面运行 1. Sp ...
- FTP文件传输协议两种模式 ftp协议集,错误码集,ftp客户端命令集
TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20.FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置.联接的方式.甚至是是否使用相同的操 ...
- 浏览器的两种模式quirks mode 和strict mode
关键字: javascript.quirks mode.strict mode 在看js代码时,有时会看到关于quirks mode(怪异模式)和strict mode(严格格式)的东西,一直也没深究 ...
- Windows2003 IIS6.0支持32位和64位两种模式的设置方法
IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...
- Doctype 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
Doctype:(Document Type)文档类型,它位于文档中最前面的位置,处于标签之前.如果你想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE的声明.确定了正确的Doctyp ...
随机推荐
- 【Codeforces Round #431 (Div. 2) A】Odds and Ends
[链接]点击打开链接 [题意] 让你把一个数组分成奇数个部分. 且每个部分的长度都是奇数. [题解] 很简单的脑洞题. 开头和结尾一定要为奇数,然后 n为奇数的话,就选整个数组咯. n为偶数的话,不能 ...
- hibernate 的映射文件快速生成:使用CodeSmith快速生成映射文件和映射类
一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来 ...
- 洛谷 P2430 严酷的训练
P2430 严酷的训练 题目背景 Lj的朋友WKY是一名神奇的少年,在同龄人之中有着极高的地位... 题目描述 他的老师老王对他的程序水平赞叹不已,于是下决心培养这名小子. 老王的训练方式很奇怪,他会 ...
- [Angular] Update FormArray with patchValue
Currently, patchValue doesn't support update FormArray. The workarround is you need to empty the for ...
- Garbage Collection Optimization for High-Throughput and Low-Latency Java Applications--转载
原文地址:https://engineering.linkedin.com/garbage-collection/garbage-collection-optimization-high-throug ...
- JS学习笔记 - 面向对象
类.对象类:模子对象:产品(成品) 蛋糕(对象) 模子(类) Array 类 arr 对象 Array.push(); 错 arr.push(); 对 new arr(); 错 原型prototype ...
- JS错误记录 - 按左右箭头div移动、一串div跟着鼠标移动
本次练习错误总结: 1. div跟着用户操作而移动,首先必须要绝对定位,否则无法移动. 2. if条件语句里面是双等号,不是单等号(赋值). 3. 坐标值没有Right,只能offsetLeft 加减 ...
- 四种卸载Mac软件的方法
从 Mac 电脑上卸载已经安装的应用程序可能是你知道的操作系统里面最简单的一种了.而如果你是一名新买了 Mac 电脑的用户,那么你可能比较困惑:怎么没有控制面板中的相应板块来卸载它们呢?但是其实你想不 ...
- 【b091&&z11】潜伏者
Time Limit: 1 second Memory Limit: 128 MB [问题描述] R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历尽艰险后,潜伏于S国的R国间谍小 ...
- iOS改动UIButton setTitle字体颜色和调整字体位置
调整Title字体位置 [button setTitleEdgeInsets:UIEdgeInsetsMake(10, 0, 0, 0)]; 四个參数分别代表:上边界,左边界.下边界,右边界 改动UI ...