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. HTML-a

    链接的其他使用 电话 <a href="tel:(phonenumber)">Tel</a> 短信 <a href="sms:(phonen ...

  2. Hadoop_10_12虚拟机01_虚拟机NAT方式联网【自己的亲测笔记】

      NAT方式 1.查看网络信息--ifconfig(同windows中的ipconfig相同) 主要关注的是第三行内容,分别是Ip地址.广播地址.子网掩码 2.安装完系统后需要配置三个地方--IP地 ...

  3. 模拟 ZOJ 3878 Convert QWERTY to Dvorak

    题目传送门 /* 模拟:手敲map一一映射,累! 除了忘记读入字符串不能用gets用getline外还是很顺利的AC了:) */ #include <cstdio> #include &l ...

  4. POJ3687 Labeling Balls(拓扑排序\贪心+Floyd)

    题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的 ...

  5. storm环境搭建

    备注——使用: 1.单机版本: 启动zkServer.nimbus.supervisor.ui服务: zkServer.sh start zkServer.sh status #查看zkserver是 ...

  6. Linux redirect the stdout to a file

      1: int save_out = dup(fileno(stdout));//backup stdout 2: int out = open("cout.log", O_RD ...

  7. window.open() 被拦截后的分析

    前言:此文章仅是个人工作中遇到问题后的一些记录和总结,可能毫无意义.. 事件回顾: 在开发中,PM要求在一个页面中输入多个链接然后可以一键在新窗口打开,所以就想到用window.open来实现,但是测 ...

  8. SpringMVC_The resource identified by this request is only capable of generating responses with characteristics

    今天在调试springMVC的时候,在将一个对象返回为json串的时候,浏览器中出现异常: The resource identified by this request is only capabl ...

  9. git 远程版本库

    [root@localhost workspace]# cd repos/ [root@localhost repos]# ll 总用量 drwxr-xr-x root root 12月 : hell ...

  10. java面试题中常见的关于String类问题总结

    问题1: String s1 = “abc”;String s2 = “abc”;System.out.println(s1 == s2); 这里的结果是true. 由于字符串是常量(内存中创建对象后 ...