package com.dlbridge.jadp.job; import com.dlbridge.jadp.plugins.cmpt.bean.Banner; import com.dlbridge.jadp.plugins.cmpt.bean.BannerStatistic; import com.dlbridge.jadp.plugins.cmpt.service.BannerService; import lombok.extern.log4j.Log4j2; import org.apache.commons.collections4.list.TreeList; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.connection.jedis.JedisClusterConnection; import org.springframework.data.redis.core.*; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.List; @Component @Log4j2 public class CountJob { public static String KEY_CMPT_HAHS = ""; public static String KEY = ""; public static String KEY_HAHS = ""; public static String KEY_DATE = new SimpleDateFormat("yyyyMMdd").format(new Date()); public static String KEY_CMPT; @Resource private ValueOperations valueOperations; @Resource private HashOperations hashOperations; @Resource RedisTemplate redisTemplate; @Resource BannerService bannerService; public static String getCmptUvKey(int cmptId){ return "micro_statistic:"+cmptId+":"+ CountJob.KEY_DATE; } public static String getCmptPvKey(int cmptId){ return "micro_statistic_hash:"+cmptId+":"+CountJob.KEY_DATE; } public static String getUvKey(int cmptId,String id){ return "micro_banner:"+cmptId+":"+id+":"+ CountJob.KEY_DATE; } public static String getPvKey(int cmptId,String id){ return "micro_banner_hash:"+cmptId+":"+id+":"+ CountJob.KEY_DATE; } @Scheduled(cron = "0 0 0 */1 * ?") //@Scheduled(fixedRate = 2*60*1000) public void job() { JedisClusterConnection clusterConnection = (JedisClusterConnection)redisTemplate.getConnectionFactory().getClusterConnection(); Collection values = clusterConnection.getNativeConnection().getClusterNodes().values(); log.info("cluster size : "+values.size()); List keys = new TreeList<>(); for(JedisPool pool : values){ String scanRet = "0"; do { Jedis resource = pool.getResource(); ScanResult scan = resource.scan(scanRet, new ScanParams().match("micro_banner*")); scanRet = scan.getStringCursor();// 返回用于下次遍历的游标 log.info("当前游标:"+scanRet); keys.addAll(scan.getResult());// 返回结果 log.info("当前key size"+scan.getResult().size()); scanRet = scan.getStringCursor(); resource.close(); } while (!scanRet.equals("0")); } log.info("key size : "+keys.size()); for(String key : keys){ log.info("当前key"+key); String[] split = key.split(":"); String cmptId = split[1]; String id = split[2]; String date = split[3]; if(key.indexOf("hash") > - 1){ Long size = hashOperations.size(getPvKey(Integer.valueOf(cmptId),id)); size = size == null ? 0 : size; Integer o = (Integer)valueOperations.get(getUvKey(Integer.valueOf(cmptId),id)); int count = o == null ? 0 : o; BannerStatistic bannerStatistic = new BannerStatistic().setBannerId(id).setCreateDate(date).setCmptId(cmptId).setPv(size).setUv(count); log.info("定时任务bannerStatistic :"+bannerStatistic); bannerService.insertBannerStatistic(bannerStatistic); }else{ Integer o = (Integer)valueOperations.get(getUvKey(Integer.valueOf(cmptId),id)); int count = o == null ? 0 : o; if(o != null){ Banner banner = new Banner(); banner.setId(id); banner.setPageView(o); log.info("定时任务banner :"+banner); bannerService.appendPageView(banner); } } valueOperations.getOperations().delete(key); log.info("删除KEY:" + key); } KEY_DATE = new SimpleDateFormat("yyyyMMdd").format(new Date()); log.info("重置日期:"+KEY_DATE); } }