侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

设计一个简单的短链接生成服务

2025-12-8 / 0 评论 / 5 阅读

题目

设计一个简单的短链接生成服务

信息

  • 类型:问答
  • 难度:⭐

考点

哈希算法应用, 键值存储设计, 基础系统组件

快速回答

实现一个短链接服务的核心要点:

  • 使用Base62编码将自增ID转换为短字符串
  • 采用键值存储(如HashMap)映射短码到原始URL
  • 服务包含两个主要端点:
    1. /shorten - 接收长URL返回短码
    2. /{shortCode} - 重定向到原始URL
  • 添加基础校验确保URL格式合法
## 解析

1. 核心原理

短链接系统通过生成紧凑的字符串替代长URL,关键技术点:

  • 短码生成:使用自增ID配合Base62编码(A-Z,a-z,0-9共62字符)
  • 存储映射:短码作为Key,原始URL作为Value的键值对
  • 重定向机制:HTTP 301/302重定向实现跳转

2. 代码示例(Python伪代码)

# 存储结构(内存示例,实际可用Redis/DB)
url_map = {}
id_counter = 100000  # 初始ID

def base62_encode(num):
    charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    short_code = ""
    while num > 0:
        num, rem = divmod(num, 62)
        short_code = charset[rem] + short_code
    return short_code

def shorten_url(long_url):
    global id_counter
    # 生成短码
    id_counter += 1
    short_code = base62_encode(id_counter)
    # 存储映射
    url_map[short_code] = long_url
    return f"https://short.url/{short_code}"

def redirect(short_code):
    long_url = url_map.get(short_code)
    if long_url:
        return HTTP_301_REDIRECT(long_url)  # 永久重定向
    else:
        return "404 Not Found"

3. 最佳实践

  • 重定向选择:301(永久重定向)利于SEO,302(临时)便于统计
  • 输入校验:验证URL格式(正则示例:^https?://[^\s/$.?#].[^\s]*$
  • 短码长度:6-8字符(Base62可表示568亿+组合)

4. 常见错误

  • 哈希冲突:自增ID+编码可避免(优于MD5截取)
  • 未处理重复URL:相同长URL应返回相同短码(添加缓存检测)
  • 缺少过期机制:实际系统需添加TTL自动清理

5. 扩展知识

  • 分布式扩展:通过分片键(如短码首字母)分割数据
  • 自定义短码:允许用户指定易记字符串(需检查唯一性)
  • 访问统计:在重定向时记录点击量(需异步处理)