Redis统计今日签到用户数和用户是否签到

2018-11-08 22:20:14
986次阅读
0个评论
可使用redis实现的案例如下:

            1)验证用户今日是否签到

            2)查询用户本月签到成功次数

            3)活跃用户统计

            4)查询今日签到用户数

具体实现如下:


import java.text.SimpleDateFormat;
import java.util.BitSet;
import java.util.Date;
import redis.clients.jedis.Jedis;

/**
 * 测试使用Redis来
 * 1.统计当前签到用户数
 * 2.验证指定用户是否签到
 * 3.活跃用户数统计
 * 4.查询本月签到用户数
 * 5.查询指定日期内的用户签到次数
 *
 */
public class RedisBitSetTest {
	static Jedis jedis = new Jedis("localhost");
	
	public static void main(String[] args) {
		//放入数据
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		String date = df.format(new Date());
		String loginAction = "login" ;
		String signinAction = "signin";
		long user_id = 134080953 ; //此处使用的是手机号码
		long user_id2 = 134080932 ; //此处使用的是手机号码
		jedis.setbit(loginAction+":"+date, user_id, true); //保存用户登录
		jedis.setbit(signinAction+":"+date, user_id, true); //保存用户签到
		jedis.setbit(loginAction+":"+date, user_id2, true); //保存用户登录
		jedis.setbit(signinAction+":"+date, user_id2, true); //保存用户签到
		
		System.out.println("验证用户"+user_id+"是否"+signinAction+":"+isAction(loginAction, date, user_id));
		System.out.println("今天签到用户数:"+uniqueCount(signinAction, date));
	}
	
	/**
	 * 查询用户今日是否签到或者做活动 
	 * 这样大大减少数据库查询的时间和效率
	 * @param action  要做的事件:签到,登录,做活动等等
	 * @param date    日期
	 * @param offset  用户(指对应key这个用户是否为1)
	 * @return
	 */
	public static boolean isAction(String action,String date,long offset){
		String key = action + ":" + date ;
		return jedis.getbit(key, offset);
	}
	
	/**
	 * 查询指定用户时间内的操作
	 * 例如:查询本月签到次数
	 * @param action
	 * @param offset
	 * @param date
	 * @return
	 */
	public static int queryAction(String action,long offset,String...dates){
		int sum = 0 ;
		for (String date : dates) {
			String key = action + ":" + date ;
			boolean value = jedis.getbit(key, offset);
			if (value)
				sum++ ;
		}
		return sum;
	}
	
	/**
	 * 查询今日签到用户数或者活跃用户数
	 * @param action 要做的事件:签到,登录,做活动等等
	 * @param date   指定日期或者今日
	 * @return 次数
	 */
	public static int uniqueCount(String action,String date){
		String key = action + ":" + date ;
		byte[] bytes = jedis.get(key.getBytes());
		BitSet bitSet = byteArray2BitSet(bytes);
		return bitSet.cardinality();
	}
	
	/**
	 * 查询指定日期的用户签到数
	 * @param action 要做的事件:签到,登录,做活动等等
	 * @param dates 指定日期
	 * @return 次数
	 */
	public static int uniqueCount(String action,String...dates){
		BitSet bitSet = new BitSet();
		for(String date:dates){
			String key = action + ":" + date ;
			BitSet bitSet2 = byteArray2BitSet(jedis.get(key.getBytes()));
			bitSet.or(bitSet2);
		}
		return bitSet.cardinality();
	}
	
	/**
	 * 将字节数组转换为位
	 * @param bytes
	 * @return BitSet
	 */
	public static BitSet byteArray2BitSet(byte[] bytes) {
		BitSet bitSet = new BitSet(bytes.length * 8);
		int index = 0;
		for (int i = 0; i < bytes.length; i++) {
			for (int j = 7; j >= 0; j--) {
				bitSet.set(index++, (bytes[i] & (1 << j)) >> j == 1 ? true
						: false);
			}
		}
		return bitSet;
	}
}


收藏00

登录 后评论。没有帐号? 注册 一个。