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上,典型的 ...
随机推荐
- DOM--1 遵循最佳实践
为重用命名空间而进行规划 (function() { function $(id) { return document.getElementById(id); } function alertNode ...
- [LintCode] Binary Tree Serialization
Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a ...
- jQuery对表单、表格的操作及更多应用(上:表单应用)
内容摘录自锋利的JQuery一书 一.表单应用 1 获取和失去焦点改变样式(P142) $(function(){ $(":input").focus(function(){ // ...
- jQuery对象和DOM对象之间的相互转换
DOM对象:DOM(Document Object Model,文档对象模型),每一份DOM都可以表示成为一棵树,DOM对象可以使用javascript中的方法. jQuery对象:jQuery对象就 ...
- COJ500 杨老师的路径规划(MST) (我是认真的)
用LCT来维护生成树,动态加边(s,t,w)时,新建节点x,权值为边权w. 1.若s与t不连通,则连接s-x,x-t,答案+w 2.若s与t连通,找出s-t路径上的最大权w2,若w<w2,删除w ...
- Notepad++ Shortcuts 快捷键
Ctrl-C Copy Ctrl-X Cut Ctrl-V Paste Ctrl-Z Undo Ctrl-Y Redo Ctrl-A Select All Ctrl-F L ...
- Leetcode | Work Break I & II
Work Break I Given a string s and a dictionary of words dict, determine if s can be segmented into a ...
- Mysql时间函数
http://blog.sina.com.cn/s/blog_6d39dc6f0100m7eo.html mysql中函数和关键字不区分大小写.下文函数的datetime参数处既可以用时间字符串也可以 ...
- switch parser.p4源码
/* Copyright 2013-present Barefoot Networks, Inc. Licensed under the Apache License, Version 2.0 (th ...
- php获取某年某月的天数 【转】
function days_in_month($month, $year) { // calculate number of days in a month return $month == 2 ? ...