本文摘自PHP中文网,作者齐天大圣,侵删。
首先我们看一个场景:一个网站,需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。如果用传统的数据库如Mysql来实现的话,很难做到。但如果用Redis来做的话,就很简便。Redis的集合类型和Bitmap类型都可以很容易的做到。今天,我们主要来谈谈如何用Bitmaps来实现统计活跃用户的功能。
Bitmaps
在计算机系统中,最小的信息单位是字节,1个字节等于8位,每一位都只可能是0或1(计算机只认识这两个数)。使用Bitmaps可以直接对位进行操作。
可以把bigmaps看做一个数组,数组里每一位只可能是0或者1,数组的下标在这里看做偏移量。
下面我们来介绍几个和Bitmaps相关的命令:
setbit
setbit key offset value:给对应的位设置值
比如今天有用户3、8、23、32访问了网站,则
1 2 3 4 |
|
开发提示:很多应用id都不是从1开始,有许多是从指定数字开始的,比如1001、10001开始。对于这些,我们在设置的时候可以先减去初始值,防止浪费空间
getbit
getbit key offset 获取指定位的值
如果我想知道今天8号用户和45号用户是否登录过,则
1 2 3 4 |
|
可以看到8号用户今天登录过,但是45号用户今天还没有登录。
bitcount
bitcount key [start] [end] 获取指定范围为1的个数
我想知道今天有多少用户登陆过了,则
1 2 |
|
Bitmaps间的操作
bitop op destkey key [key ...]
bitop命令可以对多个bitmaps做交集(and)、并集(or)、非(not)、异或(xor),并将操作结果存放在destkey中。
如果想知道连续三天都登陆过的用户,即5月17日、18日、19日都登陆的用户数量。
这三天登陆情况如下:
5月17日3、8、23、32用户登陆过
5月18日3、23、43、54号用户登陆过
5月19日3、5、23、 32、56、78号用户登陆过
1 2 3 |
|
如果想知道,这三天有多少用户登陆过。
1 2 3 4 |
|
可以看到,这三天共有9位用户登陆过。
实战
讲完上面所讲知识后,我们就可以来完成想要的需求:需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。
首先模拟用户30天内登陆情况,伪代码如下:
1 2 3 4 5 6 7 |
|
获取一周内都登陆的用户,当然我们不会一次性全部取,而是想分页那样,一次取一定数量的,伪代码如下:
相关阅读 >>
更多相关阅读请进入《Redis》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。