扫描二维码 上传二维码
选择防红平台类型,避免链接被拦截
选择允许访问的平台类型

短链接跳转服务功能详解

快缩短网址(suo.run)—— 短链接跳转服务系统设计与实现

---

一、系统核心架构:基于 DAG 的流程重构



在“快缩短网址”(suo.run)项目中,我们以有向无环图(DAG)为逻辑骨架,构建三大核心功能模块的执行路径。每一环节均具备清晰输入输出参数,确保数据流可追溯、状态可管理、性能可优化。

---

二、核心功能模块与流程设计(含输入输出参数)



#### 功能一:长链采集 → 短链生成



> 目标:将用户提交的原始长链接转化为唯一短链接,并持久化存储。

##### 📌 DAG 流程:
[输入长链接] 

[验证长链接有效性] → (返回: 1/0)

[生成短链接] → (格式: /{timestamp}-{hash})

[封装元数据] → {shorturl, longurl, created_at, type="user"}

[POST至后端 API] → /api/shorturl/create

[写入 Redis 存储]


##### ✅ 输入参数:
- long_url(str):待压缩的完整原始链接,如 https://example.com/very-long-path?param=value

##### ✅ 输出参数:
- short_url(str):生成的短链地址,如 suo.run/240517-abcd9
- status(int):1 表示成功,0 表示失败
- message(str):提示信息(如“链接无效”或“已存在”)



##### 🔧 关键函数设计:

def check_url_valid(long_url: str) -> bool:
"""检测长链接是否可达"""
try:
response = requests.head(long_url, timeout=5, allow_redirects=True)
return response.status_code == 200
except Exception:
return False

def generate_short_url(long_url: str) -> str:
"""基于时间戳与哈希生成短链"""
from datetime import datetime
timestamp = datetime.now().strftime("%y%m%d%H")
# 取长链前8位字符进行哈希处理
import hashlib
hash_part = hashlib.md5(long_url.encode()).hexdigest()[:6]
return f"{timestamp}-{hash_part}"

def build_payload(short_url: str, long_url: str) -> dict:
"""构建 POST 请求体"""
from datetime import datetime
return {
"short_url": short_url,
"long_url": long_url,
"created_at": datetime.now().isoformat(),
"type": "user"
}




##### 💬 前端交互逻辑(index.html + JS):
const formData = new FormData();
formData.append('long_url', input.value);

fetch('/api/shorturl/create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
long_url: input.value
})
})
.then(res => res.json())
.then(data => {
if (data.status === 1) {
alert(短链已生成:${data.short_url});
} else {
alert('链接无效或已存在');
}
});


---

#### 功能二:短链跳转(重定向)

> 目标:当用户访问短链时,自动跳转至对应长链,并记录访问行为。



##### 📌 DAG 流程:
[接收短链请求] → /{shortcode}

[查询 Redis 有效性] → (是否存在?)

[若存在] → [记录访问时间] + [返回 301 重定向头]

[浏览器自动跳转至长链]


##### ✅ 输入参数:
- short_code(str):来自 URL 路径的短链部分,如 240517-abcd9

##### ✅ 输出参数:
- Location(Header):重定向目标地址(长链)
- Status Code:301(永久重定向)

##### 🔧 后端路由逻辑(Flask/FastAPI):

@app.route('/<short_code>')
def redirect_to_long(short_code):
# 从 Redis 查询
key = f"short:{short_code}"
data = redis_client.hgetall(key)

if not data:
return abort(404)

long_url = data[b'long_url'].decode()

<h1>记录本次访问时间</h1>
visit_time = datetime.now().isoformat()
redis_client.zadd(f"visits:{short_code}", {visit_time: 1})

<h1>返回重定向响应</h1>
return redirect(long_url, code=301)


##### 💬 前端无需额外操作 —— 全由浏览器自动处理重定向行为。

---

#### 功能三:访问统计可视化(动态分析)

> 目标:提供短链点击趋势分析,支持按天粒度展示访问频率。

##### 📌 DAG 流程:
[前端发起统计请求] → /api/stats?short_url=xxx

[后端查询 Redis] → {visits: [date1, date2, ...]}

[聚合数据] → 按天分组,计算每日访问次数

[返回 JSON] → {short_url, visits_by_day: {"2026-05-17": 5, ...}}

[前端渲染图表] → 使用 Chart.js 绘制柱状图/折线图


##### ✅ 输入参数:
- short_url(str):待查询的短链标识符

##### ✅ 输出参数(JSON):
{
"short_url": "suo.run/240517-abcd9",
"long_url": "https://example.com/path",
"total_visits": 124,
"visits_by_day": {
"2026-05-17": 32,
"2026-05-18": 41,
"2026-05-19": 51
},
"first_visit": "2026-05-17T10:23:00Z",
"last_visit": "2026-05-19T16:45:00Z"
}


##### 🔧 后端统计接口:

@app.route('/api/stats')
def get_stats():
short_url = request.args.get('short_url')
if not short_url:
return jsonify({"error": "Missing short_url"}), 400

key = f"visits:{short_url}"
visits = redis_client.zrange(key, 0, -1, withscores=True)

<h1>按日期聚合</h1>
daily_count = {}
for dt_str, count in visits:
date = dt_str.decode()[:10] # 截取年月日
daily_count[date] = daily_count.get(date, 0) + int(count)

<h1>获取基础信息</h1>
meta_key = f"short:{short_url}"
meta = redis_client.hgetall(meta_key)
long_url = meta.get(b'long_url', b'').decode()

return jsonify({
"short_url": f"https://suo.run/{short_url}",
"long_url": long_url,
"total_visits": sum(daily_count.values()),
"visits_by_day": daily_count,
"first_visit": min(daily_count.keys()) if daily_count else None,
"last_visit": max(daily_count.keys()) if daily_count else None
})


##### 💬 前端图表集成(JavaScript + Chart.js):

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<canvas id="visitsChart"></canvas>

<script>
fetch('/api/stats?short_url=240517-abcd9')
.then(res => res.json())
.then(data => {
const ctx = document.getElementById('visitsChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: Object.keys(data.visits_by_day),
datasets: [{
label: '每日访问量',
data: Object.values(data.visits_by_day),
borderColor: '#4CAF50',
fill: false
}]
},
options: {
responsive: true,
title: { text: 短链 ${data.short_url} 访问趋势 }
}
});
});
</script>


---

三、数据结构设计(Redis Schema)



| Key | Value(Hash/ZSet) | 用途说明 |
|-----|----------------------|--------|
| short:{short_code} | {long_url: ..., created_at: ..., visits: [...]} | 主存储:短链元信息与历史访问 |
| visits:{short_code} | ZSet: {timestamp: 1} | 记录每次访问时间,用于统计 |
| long:{long_url} | short_code | 反向索引,快速校验长链是否已被创建 |

> ⚠️ 所有数据使用过期策略(TTL),默认 365 天,避免无限膨胀。

---

四、系统亮点总结(快缩短网址 · suo.run)



- ✅ 极简体验:一键生成短链,无需注册。
- ✅ 智能跳转:零延迟重定向,精准命中目标。
- ✅ 实时统计:访问数据即时呈现,趋势一目了然。
- ✅ 高可用架构:基于 Redis 高速读写,支持万级并发。
- ✅ 开源可扩展:支持自定义域名、短链规则、埋点分析等。

---

五、立即体验「快缩短网址」


👉 官网地址:https://suo.run
🚀 一分钟生成专属短链,轻松分享,高效追踪。

> 你的每一次点击,都在被记录;每一条链接,都值得被看见。
> 快缩短网址 —— 让连接更轻盈,让传播更有力。