1. 设计一个千万级 QPS 的短链生成系统,ID 生成、缓存、持久化、统计?
如何设计一个千万级 QPS 的短链生成系统?ID 生成、缓存、持久化、统计如何设计?
- 短链接 ID 的生成与编码
- 高并发读写的缓存与持久化
- 统计与重定向
短链系统核心是"长链→短链"映射与"短链→长链"重定向。ID 生成:用全局唯一 ID(如雪花算法 Snowflake、Redis 自增、发号器)生成递增 ID,再编码为短码(如 Base62 压缩长度),保证唯一且不可预测(可加随机盐)。缓存:热点短链映射高并发读,用 Redis 缓存(短码→长链),采用 Cache-Aside 或本地缓存(多级缓存)降低 DB 压力,写时先写缓存再异步落库。持久化:用关系库(如 MySQL)存映射表(短码、长链、创建时间、过期时间),主键/索引短码;写入可异步批量落库防热点。重定向:重定向请求先查缓存,未命中查库并回填缓存,返回 302/301 跳转。统计:记录访问日志(IP、时间、UA),通过消息队列收集,异步聚合到统计表/列存,支持点击量统计。千万级 QPS 需分布式缓存集群、读写分离与水平分库。
短链系统本质是"高并发读 + 一次写":ID 生成保证唯一、缓存扛读、异步落库扛写、日志队列做统计;缓存命中率是性能关键。
-- 短链映射表
CREATE TABLE short_url (
code VARCHAR(16) PRIMARY KEY, -- 短码
long_url VARCHAR(2048) NOT NULL,
expire_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_long ON short_url(long_url);