Redis统计今日签到用户数和用户是否签到
2018-11-08 22:20:14
1105次阅读
0个评论
可使用redis实现的案例如下:
1)验证用户今日是否签到
2)查询用户本月签到成功次数
3)活跃用户统计
4)查询今日签到用户数
具体实现如下:
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
相关话题
- 使用Redis bitmap统计活跃用户
- Redis BitMap 统计用户活跃指标
- Redis 统计7天连续在线用户人数
- redis使用setbit统计用户连续登录天数
- 解决root用户和普通用户的时区不一致的问题
- MySQL签到设计
- Elasticsearch Aggregation聚合统计
- spring集成Redis各种模式 单Redis,Sentinel 哨兵模式,Redis Cluster集群,Redis Sharding集群
- 正则判断字符是否是中文汉字
- javascript判断上传的文件是否为图片
- TiDB 和 MySQL的差异
- CentOS设置时间和时区
- Spring Boot配置@ConditionalOnProperty来控制Configuration是否生效
- Redis的bitMap命令
- Nginx配置http和https共存