基于 GO 实现的轻量级短网址系统,支持域名缩短,支持查看访问量,后台管理等功能。
长链接生成短链接,访问短链接 302 重定向至原始长链接,并记录访问次数。
若您有宝贵的意见或建议,欢迎提交 Pr。
依赖 | 说明 |
---|---|
Gin | 高性能 Web 框架 |
Go-Redis | NoSQL 缓存 |
Gorm | ORM 框架 |
MurmurHash,Base62 | Hash 算法 |
相关依赖,陆续添加中......
- URL 生成模块
判断网址是否合法,若合法使用 MurmurHash 算法将原始长链接 hash 为 32 位散列值,再将散列值转为 62 进制字符串,即为短链接。
将短链接存入 Redis 添加指定过期时间(3天)的缓存,并插入数据库。
- URL 访问模块
当请求时,先判断 Redis 中有无缓存,若有则直接 302 重定向,并更新访问量,重新设置短链接过期时间。若无则查询数据库,数据库也没有则返回错误。
若数据库中存在,则直接重定向,设置短链接过期时间,更新访问量。
MurmurHash:长链转短链自然需要一个哈希算法,MurmurHash 就是一种非加密型哈希算法,与 MD5、SHA 等常见哈希函数相比,性能与随机分布特征都要更佳。
MurmurHash 有 32 bit、64 bit、128 bit 的实现,64 bit 已经足够表示近 56 亿个短链接。
base62:MurmurHash 生成的哈希值最长有 20 位十进制数,为了进一步缩短短链接长度,可以将哈希值转为 62 进制,最长为 12 个字符。
Redis:生成短链接后,通常在后续一段时间内此短链接的使用频率较高,则向 Redis 中添加带过期时间的缓存来减轻数据库压力。
302 状态码:通常需要记录短链访问次数或需要删除短链接时,使用 302 临时重定向来处理,和服务器压力相比,数据的价值往往更大。