生成短链接

扫描二维码 上传二维码
选择防红平台类型,避免链接被拦截
选择允许访问的平台类型

社群裂变必备的短链设计

在信息洪流里,一条冗长的网址像失控的列车,瞬间刷屏,也瞬间耗尽耐心。于是,我们让「快缩短网址」——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——为你把每一次分享,都剪成一句恰到好处的诗。