可使用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;
}
}