結合redis實現后台統計(今日訪客/總訪客)


一、實現今日訪客

1、本項目redis的配置

  #redis相關的信息
  redis:
    host: 127.0.0.1
    port: 6381

2、controller實現數據的記錄

//獲取訪客數量
    @RequestMapping("selectIp")
    public String test(HttpServletRequest request){
    //獲取ip
        String ip = request.getHeader("x-forwarded-for");
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        System.out.println("-----"+ip);
        /*獲取當前日期*/
        Calendar calendar = new GregorianCalendar();
        String day = (calendar.get(Calendar.HOUR_OF_DAY)*60+ calendar.get(Calendar.MINUTE))+"";

        /*獲取總訪問次數*/
        String num = redisTemplate.opsForValue().get("ipAdress");
        //如果ip不為空
        if(ip != null){
            //redis中沒有這個值 或者 今日訪問時間小於當前時間說明已訪問
            if(!redisTemplate.hasKey("iptime_" + ip) ||
                   Integer.parseInt(day) < Integer.parseInt(redisTemplate.opsForValue().get("iptime_"+ip)))
            {
                //添加一個iptime_本機ip,值為當前分鍾時間,設置生命周期為一天
                redisTemplate.opsForValue().set("iptime_" + ip, day, 1,TimeUnit.DAYS);
                //重新賦值訪問次數
                num = redisTemplate.opsForValue().increment("ipAdress")+"";
            }
        }
        //返回總訪客
        return num;
    }

3、前端頁面加載事件調用接口(在不同的服務需要通過feignCilent來調用方法)

<script>
$(function(){
/*獲取訪問網頁ip*/
  $.post("/admin/selectIp",function(rs){
      $("#num").html(rs);
   },"json");
});
</script>

用戶訪問:訪問量加1,記錄ip和訪問時間

二、實現總訪客

1、創建一張記錄總訪客的表

 2、service接口的方法

public interface ICountvisitorsService extends IService<T_countvisitors> {
    //更新網站訪客數量
    boolean updateVisitors(T_countvisitors countvisitors) throws Exception;
    //查詢網站的訪問量
    T_countvisitors findCount(T_countvisitors countvisitors) throws  Exception;
}

3、serviceimpl實現類的代碼

@Service
public class CountvisitorsServiceImpl extends ServiceImpl<ICountvisitorsMapper, T_countvisitors> 
implements ICountvisitorsService { //更新網站訪客數量 @Override public boolean updateVisitors(T_countvisitors countvisitors) throws Exception { //添加修改時間 countvisitors.setUpdatetime(new Date()); return getBaseMapper().updateById(countvisitors) > 0 ? true : false; } //查詢網站的訪問量 @Override public T_countvisitors findCount(T_countvisitors countvisitors) throws Exception { return getBaseMapper().selectById(countvisitors.getCid()); }

4、編寫一個定時任務,在每天凌晨一點的時候執行(將redis中的今日訪客加上總訪客)

@Configuration
@EnableScheduling
public class MyCountTask {
    @Autowired
    private ICountvisitorsService countvisitorsService;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    //設置每天凌晨1點執行
    @Scheduled(cron="0 0 1 * * ?")
    public void CountVisitors() throws Exception {

        //清空當天數據
        if(redisTemplate.hasKey("ipAdress")){
            T_countvisitors countvisitors = new T_countvisitors();
            //修改更新時間
            countvisitors.setUpdatetime(new Date());
            //獲取數據庫中的對象
            T_countvisitors countvisitors2 = countvisitorsService.findCount(countvisitors);

            //從redis中獲取數據,存放在數據庫
            countvisitors.setNum(Integer.parseInt(redisTemplate.opsForValue().get("ipAdress"))+countvisitors2.getNum());
            //刪除redis中的今日訪客
            redisTemplate.delete("ipAdress");
            //執行修改數據,保存總訪客
            countvisitorsService.updateVisitors(countvisitors);
        }
    }

5、返回今日訪客與總訪客的controller

//顯示今日訪問頁面的人數、總訪問頁面的人數
    @RequestMapping("pageCount")
    public JSONResult pageCount() throws Exception {
        JSONResult<String> jsonResult = new JSONResult<>();
        T_countvisitors countvisitors = countvisitorsService.findCount(new T_countvisitors());
        List<String> listNum = new ArrayList<>();
        listNum.add(redisTemplate.opsForValue().get("ipAdress"));
        listNum.add(countvisitors.getNum() + "");
        jsonResult.setRecords(listNum);
        jsonResult.setCode(20000);
        return jsonResult;
    }

實現每周、每月、訪客地區數據--需要創建多一些表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM