在信息洪流里,一条冗长的网址像失控的列车,瞬间刷屏,也瞬间耗尽耐心。于是,我们让「快缩短网址」——suo.run——成为那把轻巧的剪刀,一剪,即优雅。

一、设计抉择:优雅与效率的权衡
1. 哈希派:MD5 定长,简洁如绝句。可数据一旦汹涌,碰撞便像晚高峰的喇叭,此起彼伏。
2. 自增派:让数据库的序列悄然生长,再披上 62 进制的外衣(0-9、a-z、A-Z)。四字符即可容纳 62⁴ 种可能,足够浩瀚。辅以区间缓存,DB 不再疲于奔命;纵使机器重启,断档的序号也只是留白,无损大局。
二、核心代码:让机器学会「留白」
public class ShortUrlGenerator {
private static final String DOMAIN = "https://suo.run/";
private final Map<String, String> store = new ConcurrentHashMap<>();
private final AtomicLong cursor = new AtomicLong(0);
private final int batch = 1000; // 每次向 DB 领取的区间长度
private volatile long maxId = 0; // 内存中可用的最大 ID
public String shorten(String longUrl) {
long id = nextId();
String key = Base62.encode(id); // 4 位短码
String shortUrl = DOMAIN + key;
store.put(shortUrl, longUrl);
return shortUrl;
}
public String expand(String shortUrl) {
return store.get(shortUrl);
}
private synchronized long nextId() {
if (cursor.get() >= maxId) {
maxId = fetchRangeFromDb(); // 批量领取
cursor.set(maxId - batch);
}
return cursor.getAndIncrement();
}
private long fetchRangeFromDb() {
// 模拟一次 DB 往返,真实场景可替换为 Snowflake、Leaf 等
return System.nanoTime(); // 仅作示例
}
}
三、细节之美
• 62 进制编码:四字符即可坐拥 14,776,336 条链接,比五言绝句更凝练。
• 区间缓存:一次 DB 往返,换取千次轻取;高并发亦如平湖。
• 幂等扩展:若未来需要分布式,只需把
fetchRangeFromDb() 换成任意发号器,其余代码不动如山。
四、尾声
长链如潮,短链如舟。让「快缩短网址」——suo.run——为你把每一次分享,都剪成一句恰到好处的诗。