Redis-统计活跃用户
Bitmap(即Bitset)
Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR以及其它位操作。
package test.jedis; import java.text.SimpleDateFormat;
import java.util.BitSet;
import java.util.Date; import redis.clients.jedis.Jedis; public class UserJedisUtil {
public static Jedis redis = new Jedis("localhost", 6379);// 连接redis public static void main(String [] args){
initLogin();
} /**
* 初始化数据
* */
public static void initLogin(){ redis.flushDB();
//默认设置当天用户编号为 1,3,4,6,20的用户登陆
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String today= format.format(new Date());
UserJedisUtil.activeUsers("daily_active_users:"+today, 1);
UserJedisUtil.activeUsers("daily_active_users:"+today, 3);
UserJedisUtil.activeUsers("daily_active_users:"+today, 4);
UserJedisUtil.activeUsers("daily_active_users:"+today, 6);
UserJedisUtil.activeUsers("daily_active_users:"+today, 20); UserJedisUtil.activeUsers("daily_active_users:2016-06-27", 1);
UserJedisUtil.activeUsers("daily_active_users:2016-06-27",2);
UserJedisUtil.activeUsers("daily_active_users:2016-06-27", 8); UserJedisUtil.activeUsers("daily_active_users:2016-06-26", 5); int i=UserJedisUtil.uniqueCount("daily_active_users",today);
System.out.println("用来统计某个用户操作在某天的活跃用户:"+i); int i1=UserJedisUtil.uniqueCount("daily_active_users",today,"2016-06-27","2016-06-26");
System.out.println("用来统计多个日期的活跃用户数:"+i1); } /**
* 每日用户登陆记录
* */
public static boolean activeUsers(String action,long user_id){ return redis.setbit(action, user_id,true);
} /**
* 用来统计在某天的活跃用户数
* key 的设计原则是每天一个key 格式为 daily_active_users:当日日期
* */
public static int uniqueCount(String action, String date) {
String key = action + ":" + date;
BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
return users.cardinality();
} /**
* 用来统计在一个指定多个日期的活跃用户数。计算方式:做Union操作
* 相当月多个日期的登陆用户的并集,在这个日期范围内登陆过的只计算一次。
* key 的设计原则是每天一个key 格式为 daily_active_users:当日日期
* */
public static int uniqueCount(String action, String... dates) {
BitSet all = new BitSet();
for (String date : dates) {
String key = action + ":" + date;
System.out.println(key);
BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
all.or(users);
} return all.cardinality();
} }
Redis-统计活跃用户的更多相关文章
- 拼多多后台开发面试真题:如何用Redis统计独立用户访问量
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...
- 拼多多面试真题:如何用 Redis 统计独立用户访问量!
阅读本文大概需要 2.8 分钟. 作者:沙茶敏碎碎念 众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作 3 年的开发,稍微优秀一点的,都给到 30K 的 Offer. 当然,拼 ...
- 如何用 Redis 统计独立用户访问量
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...
- 如何用Redis统计独立用户访问量
拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢? 使用Hash 哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表 ...
- 用Redis bitmap统计活跃用户、留存
Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作. 原文:http://blog.getspool.com/2011/11/29/fast-e ...
- 用mongo和redis查询排行榜、统计活跃用户
nosql数据库能解决关系型数据库遇到的性能和扩展性的问题,本博客将以mongodb和redis两种nosql数据库为基础,简单的介绍下面两个业务场景的解决方案: 1.查询排行榜(以当日总步数排名为例 ...
- 用redis统计大量用户的登陆情况[只判断是否活跃]
有这样的一个场景需求:有上亿的用户,要统计这批用户的登陆情况,例如一周连续登陆,连续三天是是否登陆,一周活跃天数等用户 存在的挑战 数据如何尽可能用小的空间存储 如何能快速获取指定的数据 如果使用文件 ...
- 05 redis中的Setbit位图法统计活跃用户
一:场景=>>>长轮询Ajax,在线聊天时,能够用到 Setbit 的实际应用 场景: 1亿个用户, 每个用户 登陆/做任意操作 ,记为 今天活跃,否则记为不活跃 每周评出: 有奖活 ...
- 使用 Redis 统计在线用户人数
在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...
- redis 用setbit(bitmap)统计活跃用户
getspool.com的重要统计数据是实时计算的.Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间.在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的 ...
随机推荐
- Burpsuite教程与技巧之HTTP brute暴力破解
Burpsuite教程与技巧之HTTP brute暴力破解 Gall @ WEB安全 2013-02-28 共 19052 人围观,发现 32 个不明物体收藏该文 感谢Gall投递 常规的对usern ...
- SU Demo之02Filtering--01Sufilter
欢迎各位网友批评指正! 今天博文例子位于如下目录: 第一个脚本: 下面是显示结果: 第二个脚本: 运行结果如下: 第三个脚本: 第四个脚本: 第五个脚本: 最后看看sumute命令的说明:
- HTML-Canvas02
文字对齐方式 : 水平对齐 //是用 textAlign 属性设置水平对齐方式(默认坐标点) ctx.textAlign = "start"; ctx.font = "3 ...
- API分析——Jquery UI Dialog
1.阅读API文档的一般方法? 通常地, API由三部分构成:属性.方法.事件. 属性表示参数配置,作为一个组件的微调,或者功能的开启与关闭: 方法表示组件能够发生的动作,或者组件的状态监测: 事件表 ...
- HDU 2364 (记忆化BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2364 题目大意:走迷宫.从某个方向进入某点,优先走左或是右.如果左右都走不通,再考虑向前.绝对不能往 ...
- silverlinght 项目
silverlinght项目演示: 打开点击其中一个:
- TYVJ P1051 选课 Label:多叉转二叉&&树形dp(虐心♥)
描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这M门课并考核通过就能获得 ...
- POJ 3140 Contestants Division
题目链接 题意很扯,就是给一棵树,每个结点有个值,然后把图劈成两半,差值最小,反正各种扯. 2B错误,导致WA了多次,无向图,建图搞成了有向了.... #include <cstdio> ...
- oracle 存储过程 基础
差不多一年没写过存储过程,最近要写,发现基本忘了,google一番之后,觉得很有必要把基础的东西写下来备忘. 语句块定义: decalre -- 变量声明 var1 ); -- 仅声明 var2 ) ...
- MLUtils.loadLibSVMFile
import org.apache.spark.mllib.util.MLUtils// Load and parse the data file. val data = MLUtils.loadLi ...