Golang访客计数实现分三级:内存计数(sync.Map/互斥锁,重启归零)、文件持久化(flock加锁读写文本)、Redis(INCR原子指令,支持分天key)。前端可加随机参数防缓存,服务端可校验UA/Referer并IP+UA哈希去重。

用 Golang 实现访客计数,核心在于「轻量、并发安全、可持久化」。不依赖外部数据库也能跑起来,适合静态页面、博客或小工具嵌入。
基础内存计数(开发/测试用)
适合本地验证逻辑,用 sync.Map 或互斥锁保护全局变量:
- 定义一个带锁的计数器结构体,
Increment()方法内加锁+自增 - HTTP handler 中调用计数,并返回 JSON(如
{"count": 127}) - 注意:进程重启后归零,仅作演示
文件持久化计数(零依赖上线)
把数字存成纯文本文件,每次读-改-写,配合 os.OpenFile 和 flock 避免并发写冲突:
- 用
syscall.Flock(Linux/macOS)或golang.org/x/sys/windows(Windows)加文件锁 - 读取文件内容 → 转整型 → +1 → 写回 → 解锁
- 建议加简单重试和错误日志,避免因锁失败直接 500
Redis 支持高并发(推荐生产环境)
用 github.com/go-redis/redis/v9,利用 INCR 原子指令,天然线程安全:
立即学习“go语言免费学习笔记(深入)”;
- 初始化 Redis 客户端,设置超时和重连
- handler 中调用
client.Incr(ctx, "visitor:total").Val() - 可扩展:按天分 key(
visitor:20240520),再用GETRANGE或 Lua 聚合
前端调用与防刷建议
前端用 fetch 请求计数接口,但需注意真实性和体验平衡:
- 接口路径建议带随机 query(如
/api/hit?_t=1716420399)绕浏览器缓存 - 服务端可检查
User-Agent和Referer,过滤明显爬虫头 - 不强制登录时,可用
IP + UA Hash做简单去重(非绝对可靠,但够用)
基本上就这些。从文件到 Redis,升级路径清晰,代码量都不大,关键在选对场景——小站用文件,中等流量上 Redis,要精准去重再加 Cookie 或指纹库。










