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-统计活跃用户的更多相关文章

  1. 拼多多后台开发面试真题:如何用Redis统计独立用户访问量

    众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...

  2. 拼多多面试真题:如何用 Redis 统计独立用户访问量!

    阅读本文大概需要 2.8 分钟. 作者:沙茶敏碎碎念 众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作 3 年的开发,稍微优秀一点的,都给到 30K 的 Offer. 当然,拼 ...

  3. 如何用 Redis 统计独立用户访问量

    众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...

  4. 如何用Redis统计独立用户访问量

    拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢? 使用Hash 哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表 ...

  5. 用Redis bitmap统计活跃用户、留存

    Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作. 原文:http://blog.getspool.com/2011/11/29/fast-e ...

  6. 用mongo和redis查询排行榜、统计活跃用户

    nosql数据库能解决关系型数据库遇到的性能和扩展性的问题,本博客将以mongodb和redis两种nosql数据库为基础,简单的介绍下面两个业务场景的解决方案: 1.查询排行榜(以当日总步数排名为例 ...

  7. 用redis统计大量用户的登陆情况[只判断是否活跃]

    有这样的一个场景需求:有上亿的用户,要统计这批用户的登陆情况,例如一周连续登陆,连续三天是是否登陆,一周活跃天数等用户 存在的挑战 数据如何尽可能用小的空间存储 如何能快速获取指定的数据 如果使用文件 ...

  8. 05 redis中的Setbit位图法统计活跃用户

    一:场景=>>>长轮询Ajax,在线聊天时,能够用到 Setbit 的实际应用 场景: 1亿个用户, 每个用户 登陆/做任意操作 ,记为 今天活跃,否则记为不活跃 每周评出: 有奖活 ...

  9. 使用 Redis 统计在线用户人数

    在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...

  10. redis 用setbit(bitmap)统计活跃用户

    getspool.com的重要统计数据是实时计算的.Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间.在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的 ...

随机推荐

  1. CodeForces 656B

    C - C Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status ...

  2. Java的锁优化

    高效并发是从JDK 1.5到JDK 1.6的一个重要改进,HotSpot虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spinning).锁消除(Lo ...

  3. HTML-Audio/Video

    简介: 容器:不论是音频还是视频文件,实际上都是容器文件: 视频文件包含了音频轨道.视频轨道和其他一些元数据: 视频文件播放时,音频轨道和视频轨道是绑定在一起:元数据包含了该视频的封面.子标题.字幕等 ...

  4. Edmond_Karp算法

    核心思想:通过bfs不断在网络中寻找最短的增广路,从而求得最大流.时间复杂度O(VE^) 算法模板: int Edmond_Karp(int s,int t) { ; memset(flow,,siz ...

  5. linux gdb 没有符号表被读取。请使用 "file" 命令。

    使用gdb时遇到这个问题,刚开始接触linux下使用gdb调试程序,其原因是生成的二进制可执行文件没有使用-g选项. gcc中-g选项是为了获得有关调试信息,要用gdb进行调试,必须使用-g生成二进制 ...

  6. js html5推送 实例

    <!DOCTYPE html>   <html>   <head>   <title>Simple Webkit notification exampl ...

  7. C#泛类型链表的实现

    使用泛型LinkedList<T>类.下面的方法创建了一个LinkedList<T>类,并往链表对象中添加节点,然后使用了几种方法从链表节点中获得信息.       publi ...

  8. 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...

  9. 泛型,动态创建List<T> (转摘)

    第一种: static void Main()        {            object intList = MakeList(typeof(int), 1, 2, 3);         ...

  10. yii uploadfile 错误提示: fileinfo php extension is not installed

    rule规则里面增加 'checkExtensionByMimeType'=>false,