1. 程式人生 > 實用技巧 >結合redis實現後臺統計(今日訪客/總訪客)

結合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;
    }

實現每週、每月、訪客地區資料--需要建立多一些表