1. 短链接服务的实际应用
1.1 为什么需要短链接
短链接在现代互联网应用中扮演着重要角色。
想象一下,你在发短信推广时,一个几十个字符的长链接会占用大量字符空间。
而短链接只需要几个字符就能搞定,既节省成本又提升用户体验。
在社交媒体分享时,短链接让内容看起来更简洁。
微博的140字限制下,每个字符都很珍贵。
短链接还能帮你追踪点击数据,了解推广效果。
1.2 短链接的核心原理
短链接的工作机制其实很简单:建立一个映射关系。
长链接通过某种算法生成一个短标识,存储在数据库中。
用户访问短链接时,系统根据短标识找到原始链接,然后重定向过去。
这个过程就像给每个长链接发了一张身份证,凭证就能找到本人。
2. 两种生成策略对比
2.1 随机生成策略
随机生成就是用算法随机产生短链接标识。
这种方式实现简单,但有个问题:可能会撞车。
所以需要额外检查生成的标识是否已经存在。
2.2 自增生成策略
自增方式使用一个递增的数字作为基础。
每次生成新的短链接,数字就加1,然后转换成短标识。
这样能保证不重复,但在分布式环境下需要考虑并发问题。
3. 随机生成方式实现
3.1 核心代码实现
随机生成方式的核心思路是使用62进制字符集来构造短标识。
我们选择62进制是因为它包含了数字、小写字母和大写字母,既保证了足够的组合数量,又避免了特殊字符带来的URL编码问题。
下面的代码展示了完整的随机生成实现:
代码语言:java
AI代码解释
@RestController
@RequestMapping("/shortUrl")
public class ShortUrlController {
// 定义62进制字符集:数字+小写字母+大写字母
private String BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 短链接域名前缀
private String shortUrlPrefix = "http://a.cn/";
// 存储短链接和长链接的映射关系
private HashMap<String, String> map = new HashMap<>();
@RequestMapping("getShortUrl")
public String getShortUrl(String longUrl) {
// 参数校验:确保传入的URL不为空
if (longUrl == null || longUrl.trim().isEmpty()) {
throw new IllegalArgumentException("URL不能为空");
}
String key = createKey();
// 如果生成的key已存在,重新生成直到唯一
// 注意:在生产环境中应该限制重试次数,避免无限循环
int retryCount = 0;
while (map.containsKey(key) && retryCount < 10) {
key = createKey();
retryCount++;
}
if (retryCount >= 10) {
throw new RuntimeException("生成短链接失败,请重试");
}
map.put(key, longUrl);
return shortUrlPrefix + key;
}
@RequestMapping("getLongUrl")
public String getLongUrl(String shortUrl) {
// 参数校验:确保短链接格式正确
if (shortUrl == null || !shortUrl.startsWith(shortUrlPrefix)) {
throw new IllegalArgumentException("短链接格式不正确");
}
// 提取短链接标识,去掉域名前缀
String shortKey = shortUrl.replace(shortUrlPrefix, "");
String longUrl = map.get(shortKey);
// 如果找不到对应的长链接,返回null或抛出异常
if (longUrl == null) {
throw new RuntimeException("短链接不存在或已过期");
}
return longUrl;
}
private String createKey() {
Random rand = new Random();
StringBuilder sb = new StringBuilder();
// 生成6位随机字符串,每位从62个字符中随机选择
for (int i = 0; i < 6; i++) {
// 随机选择一个索引位置,范围是0-61
int randomIndex = rand.nextInt(62);
// 根据索引从字符集中取出对应字符
sb.append(BASE62.charAt(randomIndex));
}
return sb.toString();
}
}
3.2 代码解析
这个实现方案有几个关键设计点需要理解:
字符集选择原理:
BASE62字符集包含62个字符,这样6位字符串就能产生62^6种组合。
理论上能生成568亿个不同的短链接,对大多数应用来说够用了。
选择62进制而不是64进制,是为了避免URL中的特殊字符如'+'和'/'。
重复检测机制:
createKe

最低0.47元/天 解锁文章
8万+

被折叠的 条评论
为什么被折叠?



