結合redis實現後臺統計(今日訪客/總訪客)
阿新 • • 發佈:2020-08-03
一、實現今日訪客
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; }
實現每週、每月、訪客地區資料--需要建立多一些表