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(); } }