跳到主要内容

短链接

短链接子域把长 URL 压缩为短码,并支持按短码解析 / 跳转(带访问计数)、批量创建与删除。它的核心特征不在"缩短"本身,而在于数据归属与规模治理:短链数据存储在独立的 FreeSql 实例(ShortFlag,连接串 ShortUrlConnectionStrings),与主业务库物理隔离,并按表索引水平分片。

业务能力

  • 生成短链:长 URL 经哈希算法(由 Salt / MinHashLength 控制短码长度)生成 ShortKey,返回完整短链地址 ShortUrl
  • 解析 / 跳转:按 ShortKey 取回原链接;GET /api/plat/short-urls/r/{shortKey} 直接 302 跳转到原地址并累加 ViewHits
  • 批量与删除:支持一次创建 / 删除多条。当前创建、批量创建、按短码解析和跳转允许匿名访问;列表、详情与删除受 Platform.ShortUrl 权限保护。
  • 过期:创建时可指定 ExpireTime,为空表示永不过期。

概念与关系

  • IShortUrlServiceGetListAsync(ShortUrlQuery) / GetAsync(long id) / GetShortUrlAsync(shortKey, inCreateViewHits) / CreateAsync(...) / BatchCreateAsync(...) / DeleteAsync(long id) / BatchDeleteAsync(...)
  • 短码由 Hashids 基于 SaltMinHashLength 对自增 id 编码得到;跳转计数 ViewHits 在解析/跳转时累加。

为什么用独立库 + 分表

短链接在 Platform 里是写多、读多、体量大、但与核心业务无强关联的典型代表。设计上把这块数据单独拎出来,理由有三:

  1. 物理隔离,互不影响:通过 AddDefaultFreeSql<ShortFlag>(c, "ShortUrlConnectionStrings") 创建与主库不同的 IFreeSql 实例,配 UnitOfWorkManager<ShortFlag>IShortDbRepository<T,TKey>。短链库可单独备份、迁移、扩容,一次慢查询或大批量写入不会波及订单/用户等核心表。
  2. 水平分表抗体量ShortUrlOption.FileTableCount(默认 64)决定分片数。ShortUtil.GetTableIndex(id, FileTableCount)id 取模得到 TableIndex,FreeSql 的 AsTable 把数据落到 short_urls_{tableIndex} 这类分表里。单表不会无限膨胀,查询走对应分片即可。
  3. 短码较紧凑Salt 参与 Hashids 编码,MinHashLength 控制最短长度,便于在长度与空间之间权衡。Hashids 不是加密或访问控制,不能依靠短码本身保护敏感链接。

注:短链跳转走 /api/plat/short-urls/r/{shortKey},不是独立统计接口;当前实现没有二维码生成接口。

配置

业务含义
ShortUrlOption:Salt哈希盐值,决定短码生成结果,影响不可预测性
ShortUrlOption:MinHashLength短码最小长度
ShortUrlOption:FileTableCount分表数量(短链数据按 id % FileTableCount 分片,ShortUrlQuery.TableIndex0 ~ 63
ShortUrlConnectionStrings:DefaultDB短链库的 FreeSql DataType 数值;0 表示 MySQL
ShortUrlConnectionStrings:MySql短链库 MySQL 连接串(经 AddDefaultFreeSql<ShortFlag> 绑定)
Host:ShortUrlApiCreateAsync 返回的短链接基础地址;应以 / 结尾
{
"ShortUrlOption": {
"Salt": "ShortUrlApi",
"MinHashLength": 6,
"FileTableCount": 64
},
"ShortUrlConnectionStrings": {
"DefaultDB": "0",
"UseJsonMap": true,
"MySql": "Data Source=localhost;Port=3306;User ID=<user>;Password=<password>;Initial Catalog=freekit_shorturl;Charset=utf8mb4;SslMode=none"
},
"Host": {
"ShortUrlApi": "https://example.com/kit_api/api/plat/short-urls/r/"
}
}

开发配置当前没有填写 Host:ShortUrlApi,此时创建结果中的 ShortUrl 只会包含短码。要在本地直接得到可访问的完整 URL,需要显式配置该项。

开发示例

private readonly IShortUrlService _shortUrlService;

// 生成短链
var created = await _shortUrlService.CreateAsync(new CreateShortUrlReq
{
LongUrl = "https://very-long-url.com/path",
ExpireTime = null
});
string url = created.ShortUrl; // 完整短链地址

// 按短码取原地址(inCreateViewHits=true 表示累加访问数)
var hit = await _shortUrlService.GetShortUrlAsync(created.ShortKey, true);
string origin = hit.LongUrl;

相关文档