<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>短链接 on Yeqown</title>
    <link>https://www.yeqown.xyz/tags/%E7%9F%AD%E9%93%BE%E6%8E%A5/</link>
    <description>Recent content in 短链接 on Yeqown</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Mon, 29 Jan 2018 10:22:00 +0000</lastBuildDate>
    <atom:link href="https://www.yeqown.xyz/tags/%E7%9F%AD%E9%93%BE%E6%8E%A5/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ShortURL系统实现</title>
      <link>https://www.yeqown.xyz/2018/01/29/ShortURL%E7%94%9F%E6%88%90%E7%B3%BB%E7%BB%9F/</link>
      <pubDate>Mon, 29 Jan 2018 10:22:00 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/29/ShortURL%E7%94%9F%E6%88%90%E7%B3%BB%E7%BB%9F/</guid>
      <description>&lt;p&gt;在知乎上看了一个很有启发的回答，因此实际动手来实现短URL生成系统。贴上链接：&#xA;&lt;a href=&#34;https://www.zhihu.com/question/29270034&#34;&gt;知乎 - 短URL系统是如何设计的&lt;/a&gt;。其中提到了，要实现短URL生成系统要解决的问题有：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;如何优雅的实现？&lt;/li&gt;&#xA;&lt;li&gt;怎么基本实现长对短、一对一？&lt;/li&gt;&#xA;&lt;li&gt;如何实现分布式，高并发，高可用？&lt;/li&gt;&#xA;&lt;li&gt;储存选用？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;基本原理&#34;&gt;基本原理&lt;a class=&#34;anchor&#34; href=&#34;#%e5%9f%ba%e6%9c%ac%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;数据库自增ID转换62进制&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用自增ID不会产生重复的短链接。&lt;/li&gt;&#xA;&lt;li&gt;为了解决自增ID超长和不便记忆，对ID进行62进制编码。&lt;em&gt;所谓62进制就是0-9，a-z，A-Z。&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;简单计算下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;62 ^ 4 = 14,776,336&#xA;62 ^ 5 = 916,132,832&#xA;62 ^ 6 = 56,800,235,584 // 已经足够使用了&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;总体结构及处理流程&#34;&gt;总体结构及处理流程&lt;a class=&#34;anchor&#34; href=&#34;#%e6%80%bb%e4%bd%93%e7%bb%93%e6%9e%84%e5%8f%8a%e5%a4%84%e7%90%86%e6%b5%81%e7%a8%8b&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.yeqown.xyz/images/service_frame.png&#34; alt=&#34;服务结构&#34; /&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;长链接处理流程&#34;&gt;长链接处理流程&lt;a class=&#34;anchor&#34; href=&#34;#%e9%95%bf%e9%93%be%e6%8e%a5%e5%a4%84%e7%90%86%e6%b5%81%e7%a8%8b&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;获取参数，调用shortURL服务&lt;/li&gt;&#xA;&lt;li&gt;尝试从缓存中获取，如果命中，则读取短链接(重置过期时间)。跳转第4步&lt;/li&gt;&#xA;&lt;li&gt;将长链接存储到Mysql数据库，根据ID进行base62编码，组装Domain+Encoded字符串并更新数据库&lt;/li&gt;&#xA;&lt;li&gt;返回生成的短链接&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h4 id=&#34;短链接处理流程&#34;&gt;短链接处理流程&lt;a class=&#34;anchor&#34; href=&#34;#%e7%9f%ad%e9%93%be%e6%8e%a5%e5%a4%84%e7%90%86%e6%b5%81%e7%a8%8b&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;解析短链接为ID&lt;/li&gt;&#xA;&lt;li&gt;查询ID对应的长链接&lt;/li&gt;&#xA;&lt;li&gt;以301方式跳转到长链接&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;长链接与短链接的对应关系&#34;&gt;长链接与短链接的对应关系&lt;a class=&#34;anchor&#34; href=&#34;#%e9%95%bf%e9%93%be%e6%8e%a5%e4%b8%8e%e7%9f%ad%e9%93%be%e6%8e%a5%e7%9a%84%e5%af%b9%e5%ba%94%e5%85%b3%e7%b3%bb&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;一对多，一个长链接可能对应多个短链接。数据表存储结构如下：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;+-----------+--------------+------+-----+---------+----------------+&#xA;| Field     | Type         | Null | Key | Default | Extra          |&#xA;+-----------+--------------+------+-----+---------+----------------+&#xA;| id        | int(64)      | NO   | PRI | NULL    | auto_increment |&#xA;| long_url  | varchar(100) | NO   |     | NULL    |                |&#xA;| short_url | varchar(40)  | YES  |     | NULL    |                |&#xA;+-----------+--------------+------+-----+---------+----------------+&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;分布式和高并发设计&#34;&gt;分布式和高并发设计&lt;a class=&#34;anchor&#34; href=&#34;#%e5%88%86%e5%b8%83%e5%bc%8f%e5%92%8c%e9%ab%98%e5%b9%b6%e5%8f%91%e8%ae%be%e8%ae%a1&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;###注：这部分未实现。我的思路如下：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
