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做产品统计的两种模式的更多相关文章

  1. Flink on Yarn的两种模式及HA

    转自:https://blog.csdn.net/a_drjiaoda/article/details/88203323 Flink on Yarn模式部署始末:Flink的Standalone和on ...

  2. 【转】Reactor与Proactor两种模式区别

    转自:http://www.cnblogs.com/cbscan/articles/2107494.html 两种IO多路复用方案:Reactor and Proactor 一般情况下,I/O 复用机 ...

  3. ACE_linux:Reactor与Proactor两种模式的区别

    一.概念: Reactor与Proactor两种模式的区别.这里我们只关注read操作,因为write操作也是差不多的.下面是Reactor的做法: 某个事件处理器宣称它对某个socket上的读事件很 ...

  4. JSP中两种模式的总结

    运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...

  5. Spark On Yarn的两种模式yarn-cluster和yarn-client深度剖析

    Spark On Yarn的优势 每个Spark executor作为一个YARN容器(container)运行.Spark可以使得多个Tasks在同一个容器(container)里面运行 1. Sp ...

  6. FTP文件传输协议两种模式 ftp协议集,错误码集,ftp客户端命令集

    TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20.FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置.联接的方式.甚至是是否使用相同的操 ...

  7. 浏览器的两种模式quirks mode 和strict mode

    关键字: javascript.quirks mode.strict mode 在看js代码时,有时会看到关于quirks mode(怪异模式)和strict mode(严格格式)的东西,一直也没深究 ...

  8. Windows2003 IIS6.0支持32位和64位两种模式的设置方法

    IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...

  9. Doctype 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?

    Doctype:(Document Type)文档类型,它位于文档中最前面的位置,处于标签之前.如果你想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE的声明.确定了正确的Doctyp ...

随机推荐

  1. 2lession-文件访问

    今天继续学习python,因为是根据网上的教程,里面用到了一些例子,包含有后面的知识点.但是,因为自己稍微有点c.java等语言基础,所以并没有严格按照教程来学习,反而是遇到知识点就记录下来. 代码如 ...

  2. ua识别(浏览器标识识别)

    ua识别(浏览器标识识别) 一.总结 1.浏览器标识(UA):可以使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件,从而判断用户是使用电脑 ...

  3. 使用Spring框架的好处

    转自:https://www.cnblogs.com/hoobey/p/6032506.html 在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JD ...

  4. Android 利用代码在屏幕中间位置显示ProgressDialog和ProgressBar

    package cc.testprogressdialog; import android.os.Bundle; import android.view.Gravity; import android ...

  5. (错误记录)Vue: Unknown custom element

    错误: vue.js:634 [Vue warn]: Unknown custom element: <ve-pie> - did you register the component c ...

  6. tcl -mode

    -exact     严格匹配(如string equal) -glob 通配符式匹配(string match) -regexp   正则表达式匹配(regexp) array get和array ...

  7. HTML中input标签maxlength属性的妙处

    HTML中的input标签可是很常用的. HTML本身也非常简单,就是若干标签,每个标签有若干属性. 我在学习HTML的过程中,也没有太过重视. 今年,在写前端表单验证的时候,发现maxlength这 ...

  8. 洛谷 P1510 精卫填海

    洛谷 P1510 精卫填海 题目描述 [版权说明] 本题为改编题. [问题描述] 发鸠之山,其上多柘木.有鸟焉,其状如乌,文首,白喙,赤足,名曰精卫,其名自詨.是炎帝之少女,名曰女娃.女娃游于东海,溺 ...

  9. 解决Keystore was tampered with, or password was incorrect

    使用签名文件keystore查看生成的数字签名中报错解决 Keystore was tampered with, or password was incorrect 这是由于android规定自己定义 ...

  10. (转)linux screen 命令详解

    转自:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html 一.背景 系统管理员经常需要SSH 或者telent 远程登录到Lin ...