package cn.chnmuseum.party.service; import cn.chnmuseum.party.common.util.DateUtil80; import cn.chnmuseum.party.model.PageViewRecord; import cn.chnmuseum.party.model.PageViews; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.Iterator; import java.util.Set; @Service public class PublicService { @Resource private RedisTemplate redisTemplate; @Resource private IPageViewRecordService pageViewRecordService; @Resource private IPageViewsService pageViewsService; /** * 缓存页面访问量数据,超过5分钟或者数据量超过10条时直接插入数据库 * * @param detailId 详情信息ID(具体的业务,网点,活动,产品ID) * @param userId 用户ID * @param bankId 网点ID * @param type 页面类型:1-业务办理助手2-网点服务地图3-热门产品4-热门活动 */ public void cacheData(String detailId, String userId, String bankId, Integer type) { String recordsKey = "pageViewRecords"; String timeKey = "pageViewRecordsTime"; Date currDateTime = DateUtil80.getCurrDateTime(); Date currDate = DateUtil80.getCurrDate(); PageViewRecord pageViewRecord = new PageViewRecord(); pageViewRecord.setUserId(userId); pageViewRecord.setBankId(bankId); pageViewRecord.setCreateTime(currDateTime);//年月日时分秒 pageViewRecord.setType(type); pageViewRecord.setDetailId(detailId); redisTemplate.opsForSet().add(recordsKey, pageViewRecord); if (!redisTemplate.hasKey(timeKey)) { //没有时间戳标记说明是第一次进入 redisTemplate.opsForValue().set(timeKey, currDateTime); } else { //取出记录集合 Set<PageViewRecord> recordValues = redisTemplate.opsForSet().members(recordsKey); int size = recordValues.size(); //取出时间判断和当前时间有没有超过5分钟 Date timeValue = (Date) redisTemplate.opsForValue().get(timeKey); long disSecond = (currDateTime.getTime() - timeValue.getTime()) / 1000; //缓存的数据量达到10条以上或者时间超过5分钟,进行数据存储 if (size >= 10 || disSecond >= 300) { int typeOne = 0; int typeTwo = 0; int typeThree = 0; int typeFour = 0; //数据量达到10条以上,将数据插入数据库,并且清空redis Iterator<PageViewRecord> iterator = recordValues.iterator(); while (iterator.hasNext()) { //单条缓存的数据 PageViewRecord cacheValue = iterator.next(); pageViewRecord = new PageViewRecord(); pageViewRecord.setUserId(cacheValue.getUserId()); pageViewRecord.setBankId(cacheValue.getBankId()); pageViewRecord.setCreateTime(cacheValue.getCreateTime()); pageViewRecord.setType(cacheValue.getType()); pageViewRecord.setDetailId(cacheValue.getDetailId()); //将数据插入数据库 this.pageViewRecordService.save(pageViewRecord); //记录每个页面的访问数量 if (cacheValue.getType() == 1) { typeOne += 1; } else if (cacheValue.getType() == 2) { typeTwo += 1; } else if (cacheValue.getType() == 3) { typeThree += 1; } else if (cacheValue.getType() == 4) { typeFour += 1; } } QueryWrapper<PageViews> viewsWrapper = new QueryWrapper<>(); PageViews pageViews = new PageViews(); if (typeOne != 0) { viewsWrapper.eq("type", 1); PageViews one = this.pageViewsService.getOne(viewsWrapper); if (one != null) { pageViews.setId(one.getId()); pageViews.setTimes(one.getTimes() + typeOne); this.pageViewsService.updateById(pageViews); } else { pageViews.setType(1); pageViews.setPageName("业务办理助手"); pageViews.setTimes(typeOne); pageViews.setViewDate(currDate); this.pageViewsService.save(pageViews); } } if (typeTwo != 0) { viewsWrapper = new QueryWrapper<>(); pageViews = new PageViews(); viewsWrapper.eq("view_date", currDate); viewsWrapper.eq("type", 2); PageViews one = this.pageViewsService.getOne(viewsWrapper); if (one != null) { pageViews.setId(one.getId()); pageViews.setTimes(one.getTimes() + typeTwo); this.pageViewsService.updateById(pageViews); } else { pageViews.setType(2); pageViews.setPageName("网点服务地图"); pageViews.setTimes(typeTwo); pageViews.setViewDate(currDate); this.pageViewsService.save(pageViews); } } if (typeThree != 0) { viewsWrapper = new QueryWrapper<>(); pageViews = new PageViews(); viewsWrapper.eq("view_date", currDate); viewsWrapper.eq("type", 3); PageViews one = this.pageViewsService.getOne(viewsWrapper); if (one != null) { pageViews.setId(one.getId()); pageViews.setTimes(one.getTimes() + typeThree); this.pageViewsService.updateById(pageViews); } else { pageViews.setType(3); pageViews.setPageName("热门产品"); pageViews.setTimes(typeThree); pageViews.setViewDate(currDate); this.pageViewsService.save(pageViews); } } if (typeFour != 0) { viewsWrapper = new QueryWrapper<>(); pageViews = new PageViews(); viewsWrapper.eq("view_date", currDate); viewsWrapper.eq("type", 4); PageViews one = this.pageViewsService.getOne(viewsWrapper); if (one != null) { pageViews.setId(one.getId()); pageViews.setTimes(one.getTimes() + typeFour); this.pageViewsService.updateById(pageViews); } else { pageViews.setType(4); pageViews.setPageName("热门活动"); pageViews.setTimes(typeFour); pageViews.setViewDate(currDate); this.pageViewsService.save(pageViews); } } //插入数据库后清空redis redisTemplate.opsForValue().set(timeKey, currDateTime); redisTemplate.delete(recordsKey); } } } }