java redis 实现pv uv_同步Redis中PV&UV数据到MongoDB的定时任务

该博客介绍了一个Java后台任务,该任务定期从Redis中读取PV(页面浏览量)和UV(独立访客数)数据,并将这些数据同步到MongoDB。任务首先检查MongoDB中是否存在当天的数据记录,如果不存在则插入新记录,如果存在则更新已有记录。整个过程涉及Redis的ZrevrangeWithScores操作来获取分数排序的集合,以及MongoTemplate进行MongoDB的相关操作。
摘要由CSDN通过智能技术生成

packagenet.baiqu.shop.data.core.job;importlombok.extern.slf4j.Slf4j;importnet.baiqu.shop.data.core.util.DateUtils;importnet.baiqu.shop.data.core.util.RedisUtil;importnet.baiqu.shop.data.dal.entity.document.MPv;importnet.baiqu.shop.data.dal.entity.document.MShopPvStatistic;importnet.baiqu.shop.data.dal.entity.document.MShopUvStatistic;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.mongodb.core.MongoTemplate;importorg.springframework.data.mongodb.core.query.Criteria;importorg.springframework.data.mongodb.core.query.Query;importorg.springframework.data.mongodb.core.query.Update;importorg.springframework.scheduling.annotation.EnableScheduling;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;importorg.springframework.util.CollectionUtils;importredis.clients.jedis.Jedis;importredis.clients.jedis.Tuple;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importjava.util.Set;/*** 同步redis和mongodb中pv uv统计数据的定时任务*/@Component

@EnableScheduling

@Slf4jpublic classPvUvJob {/**权益商城appId*/

private static final String SHOP_APP_ID = "500000";/**redis片区*/

private static final int REDIS_INDEX = 0;/**权益商城PV统计collection*/

private static final String SHOP_PV_COLLECTION = "shop_pv_statistic";/**权益商城UV统计collection*/

private static final String SHOP_UV_COLLECTION = "shop_uv_statistic";

@AutowiredprivateMongoTemplate mongoTemplate;

@AutowiredprivateRedisUtil redisUtil;/*** 同步Redis中PV数据到MongoDB定时任务*/@Scheduled(fixedRate= 10 * 60 * 1000)public voidredisPvToMongodbTask() {

String day= DateUtils.formatToString(new Date(), "yyyy-MM-dd");

String key= SHOP_APP_ID + "_pv_" +day;

log.info("PvUvJob.redisPvToMongodbTask: 开始同步{}数据", key);//查询mongodb中是否有当天的pv统计数据,有则更新,无则插入

MShopPvStatistic shopPvStatistic =mongoTemplate.findOne(

Query.query(

Criteria.where("day").is(day)

), MShopPvStatistic.class);

List pvList = new ArrayList<>();//查询redis中的pv数据

long total = this.queryPvByRedis(key, pvList);if (shopPvStatistic == null) {//插入//封装pv统计数据

shopPvStatistic = newMShopPvStatistic();

shopPvStatistic.setAppId(SHOP_APP_ID);

shopPvStatistic.setDay(day);

shopPvStatistic.setPvList(pvList);

shopPvStatistic.setTotal(total);

shopPvStatistic.setCreateTime(newDate());

shopPvStatistic.setUpdateTime(newDate());//将pv统计数据存入mongo中

mongoTemplate.insert(shopPvStatistic, SHOP_PV_COLLECTION);

log.info("PvUvJob.redisPvToMongodbTask: 插入{}数据到mongo", key);

}else{//更新

mongoTemplate.updateFirst(

Query.query(new Criteria("day").is(day)

),

Update.update("total", total)

.set("pvList", pvList)

.set("updateTime", newDate()),

MShopPvStatistic.class);

log.info("PvUvJob.redisPvToMongodbTask: 更新{}数据到mongo", key);

}

log.info("PvUvJob.redisPvToMongodbTask: 完成同步{}数据", key);

}/*** 同步Redis中UV数据到MongoDB定时任务*/@Scheduled(fixedRate= 10 * 60 * 1000)public voidredisUvToMongodbTask() {

String day= DateUtils.formatToString(new Date(), "yyyy-MM-dd");

String key= SHOP_APP_ID + "_uv_" +day;

log.info("PvUvJob.redisUvToMongodbTask: 开始同步{}数据", key);//查询mongodb中是否有当天的uv统计数据,有则更新,无则插入

MShopUvStatistic shopUvStatistic =mongoTemplate.findOne(

Query.query(

Criteria.where("day").is(day)

), MShopUvStatistic.class);//查询redis中的uv数据

long total = this.queryUvByRedis(key);if (shopUvStatistic == null) {//插入//封装uv统计数据

shopUvStatistic = newMShopUvStatistic();

shopUvStatistic.setAppId(SHOP_APP_ID);

shopUvStatistic.setDay(day);

shopUvStatistic.setTotal(total);

shopUvStatistic.setCreateTime(newDate());

shopUvStatistic.setUpdateTime(newDate());//将pv统计数据存入mongo中

mongoTemplate.insert(shopUvStatistic, SHOP_UV_COLLECTION);

log.info("PvUvJob.redisUvToMongodbTask: 插入{}数据到mongo", key);

}else{//更新

mongoTemplate.updateFirst(

Query.query(new Criteria("day").is(day)

),

Update.update("total", total)

.set("updateTime", newDate()),

MShopUvStatistic.class);

log.info("PvUvJob.redisUvToMongodbTask: 更新{}数据到mongo", key);

}

log.info("PvUvJob.redisUvToMongodbTask: 完成同步{}数据", key);

}/*** 查询Redis中PV数据*/

private long queryPvByRedis(String key, ListpvList) {

Jedis jedis=redisUtil.getJedis();long total = 0;

jedis.select(REDIS_INDEX);

Set tuples = jedis.zrevrangeWithScores(key, 0, Long.MAX_VALUE);if (!CollectionUtils.isEmpty(tuples)) {for(Tuple tuple : tuples) {

MPv pv= newMPv();

pv.setRequestURL(tuple.getElement());

pv.setCount((long) tuple.getScore());

total= total + (long) tuple.getScore();

pvList.add(pv);

}

}returntotal;

}/*** 查询Redis中UV数据*/

private longqueryUvByRedis(String key) {

Jedis jedis=redisUtil.getJedis();

jedis.select(REDIS_INDEX);

Set tuples = jedis.zrevrangeWithScores(key, 0, Long.MAX_VALUE);returntuples.size();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值