本文来自Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作。
Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。如下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。(如果你的uid不是从1开始的,比如从100000开始,实际上你也可以相应的用uid减去初始值来表示其位数,比如1000000用户对应到bitmap的第一位)
具体的代码类似下面这样:
redis.setbit(play:yyyy-mm-dd, user_id, 1)
这样一次记录的复杂度是O(1),在Redis中速度非常快。
而我们通过每天换用一个不同的key来将每天的活跃用户状态记录分开存。并且可以通过一些与或运算计算出N天活跃用户,和连接N天活跃用户这样的统计数据。
如下图,第一行表示星期一的活跃用户情况,第二行表示周二的,以此类推。为样我们通过对N天的活跃用户记录取并集操作,就能得出在N天内活跃过的用户列表。
下面表格表示对应一天,一周,一个月统计时所花费的时间。
Period
Time (ms)
Daily |
50.2 |
Weekly |
392.0 |
Monthly |
1624.8 |
下面是具体的java代码片断:
1.算出一天的活跃用户数量
import redis.clients.jedis.Jedis;
import java.util.BitSet;
...
Jedis redis = new Jedis("localhost");
...
public int uniqueCount(String action, String date) {
String key = action + ":" + date;
BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
return users.cardinality();
}
2.计算某几个内活跃用户的数量(某一天活跃就算,所以是取并集)
import redis.clients.jedis.Jedis;
import java.util.BitSet;
...
Jedis redis = new Jedis("localhost");
...
public int uniqueCount(String action, String... dates) {
BitSet all = new BitSet();
for (String date : dates) {
String key = action + ":" + date;
BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
all.or(users);
}
return all.cardinality();
}
具体的用法还很多,比如你还可以对独特终端的用户单独记一个bitmap,这样就可以统计不同终端用户的活跃情况。有的同学会说用set也能实现同样的效果。但使用set在内存使用量上是会大很多的。
转自http://blog.nosqlfan.com/html/3501.html
分享到:
相关推荐
Redis,作为一个高性能的键值数据库,提供了丰富的...无论是开发地理定位应用、跟踪用户行为,还是进行大数据量的统计分析,Redis都提供了强大的工具。通过学习和掌握这些特性,你将成为一名更加熟练的Redis使用者。
标题中的“利用Redis统计网站在线活跃用户的方法”指的是使用Redis这一内存数据存储系统来实时跟踪并统计网站的活跃用户数量。Redis支持多种数据结构,其中一种是基于字符串的位操作,即Bitmaps,这对于统计在线用户...
1. 用户签到:当用户进行签到操作时,需要将用户当天的签到信息更新到Redis中。具体操作是将对应日期的位置从0(未签到)置为1(已签到)。例如,如果用户在2019年10月8号首次签到,我们将位图中第8个位置的0改为1。...
通过 `BITCOUNT` 命令,我们可以快速统计任何用户在特定时间段内的活跃天数,或者通过 `BITOP` 操作比较不同用户之间的活跃度。 总之,Redis 的 Bitmap 类型是一种强大的数据结构,它可以有效利用内存并提供高效的...
Redis中的Bitmap是一个非常...例如,统计活跃用户总数、记录用户登录状态等,都是Bitmap的典型应用。通过巧妙地利用Bitmap,可以设计出高效、节省存储空间的解决方案,这对于大数据分析和实时监控等场景具有重要意义。
- **统计分析**:统计某个时间段内活跃用户数量。 #### 17. Redis支持的数据类型中,ZSET(有序集合)的特点是什么?它怎么用于排行榜等场景? - **ZSET**:有序集合是一种特殊的数据结构,不仅存储不重复的元素...
在需要统计用户唯一访问量等场景中非常实用。 8. Geo(地理位置) Redis 3.2引入了地理空间索引,可以存储地理位置信息,并进行距离查询、范围查询等操作,适用于地理位置相关的应用。 9. Stream Redis 5.0引入...
Redis中的精确去重计数方法主要涉及到数据结构的巧妙运用,特别是位图和咆哮位图(Roaring ...这些方法在处理大规模用户行为数据时,能够提供高效率且精确的去重计数,适用于诸如阅读量统计、活跃用户分析等多种场景。
例如,Bloom Filter就利用了位图,同时Redis中的BitMap命令也基于位图实现,如统计用户活跃度和在线用户数。 5. 跳表(Skip List) - 跳表是一种可以高效进行查找、插入和删除操作的索引结构。它通过多级索引,...