Whiteboard workshop image for scenario design thinking
备战面试2026年4月6日
返回文章列表

场景设计

设计一个抢红包系统 如何拆包 随机数 线性切割 二倍均值法

文章大纲

设计一个可靠 UDP

设计一个抢红包系统

如何拆包

  • 随机数
  • 线性切割
  • 二倍均值法

核心业务接口

抢红包

发红包

  • 落流水
  • 更新账户余额
  • 初始化红包到 Redis

设计一个秒杀系统

设计一个分布式 ID

设计一个微信步数系统

设计用户粉丝关注表

设计微博共同关注

设计数据库连接池

设计一个本地缓存

设计短链服务

2. 短链工作原理

^35a4

  • 短链接实质是一个短URL重定向服务
  • 用户访问短链时,服务器返回302状态码和原始长链接
  • 浏览器接收后自动跳转到原始长链接地址
  • 该过程对用户无感知,体验上相当于直接访问原链接

流程示意图

复制

MermaidOpen SVG
Mermaid diagram

3. 设计考量

3.1 请求量对齐策略

^e32e

  • 需要根据QPS选择合理的中间件
  • 若访问短链的QPS仅有2k,单台SSD的MySQL完全可以满足需求
  • 大流量场景考虑使用MySQL集群 + Redis加速

3.2 容量对齐策略

^6a43

  • 短链容量估算直接决定字符串长度
  • 字符越长,可存储的短链数量越多

3.3 设计对齐方案

^bba4

  1. Long URL和Short URL关系设计

    • 一个Short URL只能对应一个Long URL
    • 一个Long URL可以对应多个Short URL,节省空间
  2. 短链有效期设计

    • 考虑用户长期收藏需求,某些场景短链不应失效
    • 可根据业务需求设置不同的过期时间

3.4 服务设计

^4e32

  • 短链系统只需一个服务节点(URLService)
  • 核心方法:
    • encode: 将长链编码成短链
    • decode: 通过短链获取长链

API设计

HTTP方法路径请求体数据响应
GETshort_urlnull状态码: 301/302, 原始长链
POSTshortenlong_urlshort_url

3.5 存储设计

^a5b1

SQL方案

sql

复制

CREATE TABLE `url_map` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `long_url` varchar(160) DEFAULT NULL COMMENT '长链',
  `short_url` varchar(10) DEFAULT NULL COMMENT '短链',
  INDEX idx_long_url (long_url),
  INDEX idx_short_url (short_url),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 需要在short_url和long_url分别建立索引
  • 用short_url找long_url,用long_url找short_url都需高效

NoSQL方案

也可考虑使用NoSQL数据库,特别是对高并发有更好的支持

4. 短链生成算法

^3ba2

4.1 算法1: 使用哈希函数

  • 优点: 速度快
  • 缺点: 难以设计一个没有冲突的Hash算法

4.2 算法2: 自增ID + 数据库记录

  • 优点: 实现简单
  • 缺点: 生成的短链长度会随着记录增多而变长

4.3 算法3: Base62编码

  • 62个字符 = 10个数字(0-9) + 52个字母(a-z, A-Z)
  • 6位可表示62^6 = 570亿条记录(5位=9亿)
  • 每个短链对应一个整数ID,映射到数据库主键

Base62编码优势

  • 效率高
  • 不依赖于具体URL内容,可自定义ID分配

5. 分布式ID生成方案

^b5a1

  1. 雪花算法
  2. Zookeeper序列生成
  3. Redis自增
  4. UUID
  5. 数据库自增字段

6. 性能优化策略

^7e4a

6.1 缓存优化

  • 存储两组键值对:
    • Long URL → Short URL
    • Short URL → Long URL

6.2 地理位置优化

  • 使用CDN将数据分发到离用户近的服务器

6.3 服务器响应优化

  • 不同地区使用不同Web服务器
  • 通过DNS解析将用户引导到最近的服务器

7. 水平扩展方案

^c2d1

短链服务适合水平扩展:

  1. 使用ID/ShortUrl作Sharding Key
    • Long URL到Short URL的查询只能广播给所有数据库
  2. 使用Long URL作Sharding Key
    • Short URL到Long URL的查询需要广播给所有数据库

8. 全局唯一ID生成方案

^a4e3

方案1: 专用ID数据库

  • 该数据库不存储实际数据,仅负责生成自增ID

方案2: 使用Zookeeper生成

  • 利用Zookeeper的分布式协调能力生成唯一ID

Continue Reading

关联文档推荐

查看全部

备战面试

事务

B+树与哈希索引的核心区别在于数据结构与适用查询类型。 B+树是平衡多叉树,支持范围查询和排序,适合磁盘存储的OLAP场景; 哈希通过哈希函数实现O(1)等值查询,但无法处理范围操作,常用于内存键值存储。

备战面试

sorted set

哨兵机制是保证 Redis 的高可用性 监测主节点是否存活 - 发现主节点挂了,会选举一个从节点切换成主节点 - 同时将新的主节点信息通知给其他从节点

备战面试

进程 & 线程区别

上下级的关系来讲 - 进程是资源调度的基本单位 - 线程是程序执行的基本单位 - 进程跟线程是一对多的关系 - 比方启动一个 JVM 进程,至少会启动主线程/垃圾回收线程 资源共享&隔离的关系来讲 - 进程有自己独立的地址空间 - 线程之间是共享同个进程的地址空间 - 线程 a 出现非法操作,可能就会影响到同个进程下的其他线程