侧边栏壁纸
博主头像
colo

欲买桂花同载酒

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

设计一个高并发短链接生成系统

2025-12-11 / 0 评论 / 4 阅读

题目

设计一个高并发短链接生成系统

信息

  • 类型:问答
  • 难度:⭐⭐

考点

系统架构设计,分布式ID生成,缓存策略,数据库优化

快速回答

设计高并发短链接系统的核心要点:

  • 短码生成:使用分布式ID生成算法(如Snowflake)或Base62编码哈希值
  • 键值存储:Redis缓存热点映射关系(短码→长URL),设置TTL过期策略
  • 数据库设计:使用NoSQL(如Cassandra)存储映射关系,分片键设计为短码
  • 重定向优化:HTTP 301永久重定向减少后端负载
  • 防攻击措施:速率限制和布隆过滤器防恶意刷请求
## 解析

1. 系统架构设计

核心组件

  • API网关:处理请求路由和限流
  • 短码生成服务:分布式无状态服务
  • 缓存层:Redis集群缓存热点数据
  • 持久层:分片数据库存储映射关系
  • 统计服务:异步处理点击统计
架构图

2. 短码生成原理

方案对比

方法优点缺点
哈希算法(MD5/SHA)避免碰撞需处理冲突(加盐)
自增ID转Base62无碰撞需分布式ID生成器
预生成池高性能需维护空闲池

Base62示例代码

const BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

function encode(num) {
  if (num === 0) return BASE62[0];
  let s = '';
  while (num > 0) {
    s = BASE62[num % 62] + s;
    num = Math.floor(num / 62);
  }
  return s;
}

// 使用Snowflake生成分布式ID
const id = snowflake.nextId();
const shortCode = encode(id);  // 输出如 "3a8Fj2"

3. 存储与缓存设计

数据模型

{
"short_code": "3a8Fj2",
"original_url": "https://long-domain.com/path?query=value",
"created_at": "2023-10-05T08:00:00Z",
"expire_at": "2024-01-01T00:00:00Z",
"user_id": "user123"
}

读写策略

  • 写流程:生成短码 → 写数据库 → 写Redis
  • 读流程:Redis查询 → 未命中则查DB → 回填缓存
  • 缓存TTL:设置24小时过期,冷数据自动淘汰

4. 高并发优化

关键措施

  • 重定向:使用HTTP 301减少后续查询
  • 缓存穿透:布隆过滤器拦截非法短码请求
  • 分库分表:按短码首字母分片(如0-9,a-z,A-Z)
  • 异步统计:Kafka队列解耦点击统计处理

5. 常见错误与解决方案

错误解决方案
短码碰撞重试机制+唯一索引
缓存击穿互斥锁控制DB查询
短码猜测增加长度(6→8字符)
DB热点分片键加入随机前缀

6. 扩展知识

  • 自定义短码:额外校验唯一性,限制特殊字符
  • 时效控制:TTL自动删除过期链接
  • 安全防护:过滤恶意URL(如钓鱼网站)
  • 全球部署:使用CDN缓存重定向请求