本文来自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
分享到:
相关推荐
本文将介绍如何使用Spring Boot结合Redis Bitmap实现签到功能。通过这一实现方式,我们能够有效地进行大量用户的签到统计,节省存储空间并提高性能。文章将先阐述Redis Bitmap的基本原理,随后展示如何在Spring Boot...
使用redis实现用户的点赞统计,具体内容,博客里有,链接https://blog.csdn.net/qq_35410620/article/details/105738425
一、需求 记录用户签到,查询用户签到 ...(1)每个用户每个月单独一条redis记录,如00101010101010,从左往右代表01-31天(每月有几天,就到几天) (2)每月8号凌晨,统一将redis的记录,搬至mysql,记录如图 (3
利用了Redis模拟用户数量的统计。详细介绍见:https://blog.csdn.net/ycsss/article/details/112005912。
编程界的小学生一、位与字节二、string与bitmap三、bitmap的api1、setbit2、bitpos3、bitcount4、bitop4.1、概述4.2、and4.3、or四、利用bitmap完成需求1、统计某用户登录天数2、查看活跃用户总数五、总结 ...
C# winform中使用Redis
bitmapist, 功能强大的分析和队列库使用Redis位图 新的bitmapist服务器插件提高内存效率,提高内存效率,使运行( 可以扩展的)的成本降低了 much 。 它是完全compatiable和bitmapist运行在Redis上。 bitmapist: 一个...
windows中使用Redis 里面包含Redis在页面中的使用说明和dll的代码引用说明
在ASP.NET MVC中使用Redis 的Demo:通过Redis实现用户登陆,并保持登陆状态,设置过期时间,检测在线用户。
SpringBoot项目 MybatisPlus使用 Redis缓存.zip
Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行...下面这篇文章主要介绍了利用Redis统计网站在线活跃用户的方法,需要的朋友可以参考。
介绍redis的bitmap类型的作用和用处
redis页面缓存html使用redis实现页面缓存.docx
Java实现redis,linux安装redis,一分钟学会使用redis,就是这么简单
Java 使用 redis 保存数据 拦截器获取保存的对象
使用Redis存放Session RedisManager
c#使用Redis缓存