//清理 Redis 中的访问日志的时间间隔
const AccessLogCleanInterval = 1 * time.Minute
func startTicker() error {
ticker := time.NewTicker(AccessLogCleanInterval)
for range ticker.C {
log.Println("[StoreAccessLog] Start.")
if err := service.StoreAccessLogs(); err != nil {
log.Printf("Error while trying to store access_log %s", err)
}
log.Println("[StoreAccessLog] Finish.")
}
return nil
}
当日 Top25 访问 URL 榜单处理间隔:5分钟
所在文件 main.go
// Top25 榜单计算间隔
Top25CalcInterval = 5 * time.Minute
func startTicker2() error {
top25Ticker := time.NewTicker(Top25CalcInterval)
for range top25Ticker.C {
log.Println("[Top25Urls Ticker] Start.")
if err := storage.CallProcedureStatsTop25(); err != nil {
log.Printf("Error while trying to calculate Top25Urls %s", err)
}
log.Println("[Top25Urls Ticker] Finish.")
}
return nil
}
仪表盘中几个相关统计处理间隔:5分钟
所在文件 main.go
// 仪表盘页面中其他几个统计数据计算间隔
StatsSumCalcInterval = 5 * time.Minute
func startTicker4() error {
statsSumTicker := time.NewTicker(StatsSumCalcInterval)
for range statsSumTicker.C {
log.Println("[StatsSum Ticker] Start.")
if err := storage.CallProcedureStatsSum(); err != nil {
log.Printf("Error while trying to calculate StatsSum %s", err)
}
log.Println("[StatsSum Ticker] Finish.")
}
return nil
}
全部访问日志统计处理间隔:30分钟
所在文件 main.go
//全部访问日志分析统计的间隔
StatsIpSumCalcInterval = 30 * time.Minute
func startTicker3() error {
statsIpSumTicker := time.NewTicker(StatsIpSumCalcInterval)
for range statsIpSumTicker.C {
log.Println("[StatsIpSum Ticker] Start.")
if err := storage.CallProcedureStatsIPSum(); err != nil {
log.Printf("Error while trying to calculate StatsIpSum %s", err)
}
log.Println("[StatsIpSum Ticker] Finish.")
}
return nil
}
License
ohUrlShortener 以《木兰宽松许可证》 第2版 为开源协议发布
Copyright (c) [2023] [巴拉迪维]
[ohUrlShortener] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
ohUrlShortener
适合中小型社区网站使用的企业级短链接服务系统,支持短链接生产、查询及302转向,并自带点击量统计、独立IP数统计、访问日志查询:
https://www.ohurls.cn
快速使用
Docker 一步启动所有服务,运行
docker/one_step_start.sh
,该命令将会:docker/admin.Dockerfile
)docker/portal.Dockerfile
)docker/pull_build.yml
其他描述内容构建redis
和postgresql
镜像及服务,并对其运行状态做判断,等待缓存和数据库服务正常之后,再启动其他必要服务 (本地构建镜像请查阅local_build.yml
)network_ohurlshortener
的虚拟网络供上述服务使用9091
、9092
端口分别应对ohUrlShortener-Portal
及ohUrlShortener-Admin
应用参数说明
配置文件
根目录下
config.ini
中存放着关于 ohUrlShortener 短链接系统的一些必要配置,请在启动应用之前确保这些配置的正确性Admin 后台默认帐号
默认帐号:
ohUrlShortener
默认密码:
-2aDzm=0(ln_9^1
数据库中存储的是加密后的密码,在
structure.sql
中标有注释,如果需要自定义其他密码,可以修改这里加密规则
storage/users_storage.go
中亦可参照
storage/users_storage_test.go
中的TestNewUser()
方法HTTP API 支持
管理端 HTTP API 支持请参阅 ohUrlShortener HTTP API
短链接在应用启动时会存入 Redis 中
所有短链接再系统启动时会以
Key(short_url) -> Value(JSON{original_url,open_type})
的形式存储在 Redis 中。1. 为什么要这么做?
当短链接的查询请求进入应用时,为了能够更快、更准确的将用户请求转向到目标链接,与传统的方式从数据库中查询相比,直接从 Redis 中获取目标链接就会显得更有价值。
2. 这种处理方式有什么缺点?
理论上来说,如果 Redis 所在的服务器的内存较大的话,存储10w个Key也是可以的。但是,硬件条件不允许的情况下,就需要控制 Redis 中的 Key 数量(主要是怕机器扛不住,Redis 本身的性能不会有问题)。这部分的功能扩展,考虑在将来的某个版本中实现并允许配置管理。
3. 万一
考虑到可扩展性,多封装了一层
service
,以便需要的时候在业务逻辑层进行自定义扩展,eg:将 key 查询改成数据库查询等。短链接生产过程相关代码
所在文件
core/short_url.go
访问日志处理间隔:1分钟
所在文件
main.go
当日 Top25 访问 URL 榜单处理间隔:5分钟
所在文件
main.go
仪表盘中几个相关统计处理间隔:5分钟
所在文件
main.go
全部访问日志统计处理间隔:30分钟
所在文件
main.go
License
ohUrlShortener 以《木兰宽松许可证》 第2版 为开源协议发布
Contributor License Agreement
在 第一次提交 Pull Request 时 ,请您在 Pull Request 内容中明确写明「本人自愿接受并签署 《ohUrlShortener Contributor License Agreement》」,并在 Pull Request 信息中附带该协议链接信息。
Give Thanks To
由衷感谢以下开源软件、框架等(包括但不限于)
ohUrlShortener