redis bitmap 活跃用户记录

采用redis的优点也不用多说 计算方便 省时高效 节约空间

采用的java实现

用 bitmap 记录每一天的用户活跃情况(上线记为1,默认为0 )

setbit(String key, long offset, boolean value)

key 为键 ,offset为偏移量 ,我将其与用户id向对应,value=true 记为上线过

key的表现形式根据实际情况 如果要记录每一天的可以用采用日期的形式,我这里的标准是记录四天内都上过线的用户,所以是记为 firstDay,secondDay,thirdDay,today。today记录今天上过线的用户,然后在12点时,将secondDay的信息赋给firstDay,thirdDay的信息赋给secondDay,today的信息赋给thirdDay,today的信息清空

	public static void init() {
		jedis.setbit("firstDay", 0, false);
		jedis.setbit("secondDay", 0, false);
		jedis.setbit("thirdDay", 0, false);
		jedis.setbit("today", 0, false);
	}
	
	/**
	 *  每日更新
	 */
	public static void updActive() {
		init();
		jedis.set("firstDay".getBytes() ,  jedis.get("secondDay".getBytes()) );
		jedis.set("secondDay".getBytes() ,  jedis.get("thirdDay".getBytes()) );
		jedis.set("thirdDay".getBytes() ,  jedis.get("today".getBytes()) );
		jedis.del("today");
		jedis.setbit("today", 0, false);
	}

此处0的位置不记录用户,用来创建key,防止为空的情况(一开始只有today)。

判定一个用户是否为活跃用户

bitop(BitOP op, String destKey, String... srcKeys)

op 运算符  destKey 运算结果存放的key srcKeys待计算的Key

public static boolean isActive( int index ){
		jedis.bitop(BitOP.AND ,"nowActive", "firstDay","secondDay","thirdDay","today");
		return jedis.getbit("nowActive", index);
	}

这里会将 firstDay,secondDay,thirdDay,today 的值进行and运算(值全为1才得1),结果存到nowActive中,此时取nowActive对应位置的值,1即为活跃。

保存活跃用户

这里将nowAcitve的结果 再以list的形式存入redis,不用Pipeline会很慢...

public static void saveActiveUsers() {
		if( jedis.exists("ActiveUsers") ) {
			jedis.del("ActiveUsers");
		}
		jedis.bitop(BitOP.AND ,"nowActive","firstDay","secondDay","thirdDay","today");
		int len = jedis.get("nowActive".getBytes()).length*8;
		Pipeline p = jedis.pipelined();
		HashMap<Integer, Response<Boolean>> map = new HashMap<Integer, Response<Boolean>>();
		for(int i=1;i<len;i++) {
			map.put(i, p.getbit("nowActive", i) );
		}
		p.sync();
		for (Map.Entry<Integer,Response<Boolean>> entry : map.entrySet()) {
			if( entry.getValue().get()) {
				p.lpush("ActiveUsers",  entry.getKey().toString() );
			}
		}
		p.sync();
	}

不是十分了解redis的使用...有很多不足,仅供参考...

windows版本的redis不支持bitop的方法(也可能是我版本的问题...),建议使用linux环境下的redis

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值