0

0

如何使用Golang实现短链接访问统计_记录访问次数和来源

P粉602998670

P粉602998670

发布时间:2025-12-24 12:04:03

|

210人浏览过

|

来源于php中文网

原创

Golang短链接访问统计核心是异步记录+原子计数:重定向前提取IP/Referer/UserAgent等字段,用goroutine异步保存VisitRecord,Redis INCR实现高性能计数,再批量落库;提供按短码查询总次数与最近访问明细的统计接口。

如何使用golang实现短链接访问统计_记录访问次数和来源

用 Golang 实现短链接访问统计,核心是:每次重定向前记录一次访问(次数 +1),同时提取并保存来源信息(如 RefererUser-Agent、IP、时间等)。关键在于不阻塞重定向响应,且保证数据可靠写入。

一、设计基础数据结构与存储

先定义访问记录结构,便于后续扩展:

type VisitRecord struct {
    ID        uint64     `json:"id"`
    ShortCode string     `json:"short_code"` // 对应的短码,如 "abc123"
    IP        string     `json:"ip"`
    Referer   string     `json:"referer"`
    UserAgent string     `json:"user_agent"`
    Timestamp time.Time  `json:"timestamp"`
}

存储建议:

  • 高频写入场景(如每秒数百次访问)→ 优先用 Redis 计数(INCR short:abc123:count)+ 异步落库(如写入 Kafka 或批量插入 MySQL/PostgreSQL)
  • 中小流量或开发验证 → 直接用 SQLitePostgreSQL,建表含 short_codecountlast_visited 字段,并为 short_code 建索引
  • 避免每次访问都同步查库更新计数,可用原子操作或数据库 UPDATE ... SET count = count + 1

二、HTTP 处理器中安全记录访问

在重定向处理器中提取必要字段,异步记录(防止拖慢响应):

立即学习go语言免费学习笔记(深入)”;

func redirectHandler(w http.ResponseWriter, r *http.Request) {
    shortCode := strings.TrimPrefix(r.URL.Path, "/")
    
    // 1. 查询原始 URL(假设从 DB/Cache 获取)
    targetURL, err := getTargetURL(shortCode)
    if err != nil {
        http.Error(w, "Not found", http.StatusNotFound)
        return
    }

    // 2. 提取访问信息(注意:Referer 可能为空或伪造)
    ip := getClientIP(r)
    referer := r.Referer()
    userAgent := r.UserAgent()

    // 3. 异步记录(推荐用 goroutine + channel 或 worker pool 控制并发)
    go func() {
        record := VisitRecord{
            ShortCode: shortCode,
            IP:        ip,
            Referer:   referer,
            UserAgent: userAgent,
            Timestamp: time.Now(),
        }
        saveVisitRecord(record) // 实现可为 Redis INCR + 写入日志/DB
    }()

    // 4. 立即重定向(不影响用户感知)
    http.Redirect(w, r, targetURL, http.StatusTemporaryRedirect)
}

说明:

Med-PaLM
Med-PaLM

来自 Google Research 的大型语言模型,专为医学领域设计。

下载
  • getClientIP 应优先读 X-Forwarded-For(若部署在 Nginx/CDN 后),再 fallback 到 r.RemoteAddr
  • goroutine 中不要直接使用 rw,只传必要值(如上面已提取的字符串)
  • 高并发下建议用带缓冲的 channel 或轻量 worker 池,避免 goroutine 泛滥

三、统计接口:按需聚合查询

提供 API 查看某短链的访问概况,例如 GET /api/stats/abc123

func statsHandler(w http.ResponseWriter, r *http.Request) {
    shortCode := chi.URLParam(r, "code")
    
    // 获取总访问次数(Redis 或 DB)
    totalCount, _ := getVisitCount(shortCode)
    
    // 查询最近 10 条来源(可加 LIMIT/OFFSET)
    recentVisits, _ := getRecentVisits(shortCode, 10)
    
    json.NewEncoder(w).Encode(map[string]interface{}{
        "short_code": shortCode,
        "total_count": totalCount,
        "recent_visits": recentVisits,
    })
}

常见统计维度可扩展:

  • 按小时/天的访问趋势(需存带时间戳的明细,用 SQL GROUP BY DATE(timestamp) 或 Redis Time Series)
  • Referer 归类(识别来自微信微博、邮件等)
  • User-Agent 区分移动端/桌面端、浏览器类型
  • 独立 IP 数(需去重,适合用 Redis PFADD short:abc123:ips

四、实用增强建议

让统计更健壮、易用:

  • 忽略爬虫:检查 User-Agent 是否含 botspidercrawler,可跳过记录(视业务而定)
  • 防刷机制:对同一 IP 短时间内多次访问同一短链,可限频(如 Redis INCR + EXPIRE 60
  • 支持 UTM 参数透传:允许创建短链时携带 ?utm_source=xxx,重定向时保留,方便归因
  • 导出能力:提供 CSV 下载接口,基于时间范围和筛选条件导出明细
  • 前端埋点备用:除服务端重定向统计外,也可在落地页注入 JS 统计脚本,补全客户端行为(如页面停留时长)

不复杂但容易忽略:记录要快,查询要准,存储要稳。从 Redis 计数起步,再逐步加入明细分析,就能支撑大多数短链运营场景。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

224

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

204

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

387

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

184

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.4万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 769人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号