2019独角兽企业重金招聘Python工程师标准>>>

非常多的时候,我们不想在分享的时候采用长长的链接,主要的原因有:

  1. URL太长占显示空间、难于输入,转成二维码点点小,难于识别
  2. 长的URL提供的信息太多,不利于信息安全,甚至容易造成倒库
  3. 其他理由......

今天的理由不是重点,重点是如何用一点点代码实现这个短链接的生成。

我们的注意点有:

  1. 生成的短链接地址长度可调整,毕竟不能因为4位、5位、6位的长度变化就让我们重新写一套程序
  2. 要有防冲突处理机制,不能因为算法导致两个长链接地址生成的短地址一样就把前一个覆盖掉
  3. 有时候,一个地址用过之后觉得不需要使用了,哪么这个地址失效之后,短地址可以有效收回。

首先设计接口

/*** Created by luoguo on 2017/3/16.*/
public interface UrlShortener {/*** 设置产生短链接长度* @param length* @return*/void setLength(int length);/*** 返回短链接长度* @return*/int getLength();/*** 返回指定地址对应的短链接* @param url* @return*/String get(String url);/*** 存储对应关系* @param url* @param shortUrl*/void put(String url, String shortUrl);/*** 到库里查看是不是存在映射,如果不存在返回null* @param shortUrl* @return*/String seek(String shortUrl);/*** 据地址产生短地址* @param url* @return*/String generate(String url);/*** 根据地址和种子产生一个短地址* @param url* @param seed* @return*/String generate(String url, int seed);/*** 清除指定URL的短链接信息* @param url*/void clean(String url);/*** 清除指定时间以前没有使用的所有短链接* @param date*/void clean(Date date);
}

只是个示例,注释比较简陋,接下来是抽象类实现,把公共的内容放这里

import java.util.Random;/*** Created by luoguo on 2017/3/16.*/
public abstract class AbstractUrlShortener implements UrlShortener {public static char[] VALID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();private static Random random = new Random(System.currentTimeMillis());protected int length = 4;public AbstractUrlShortener() {}public AbstractUrlShortener(int length) {this.length = length;}public void setLength(int length) {this.length = length;}public int getLength() {return length;}public String get(String url) {String sortUrl = seek(url);if (sortUrl == null) {sortUrl = generate(url);put(url, sortUrl);}return sortUrl;}public String generate(String url, int seed) {char[] sortUrl = new char[length];for (int i = 0; i < length; i++) {sortUrl[i] = VALID_CHARS[seed % VALID_CHARS.length];seed = random.nextInt(Integer.MAX_VALUE) % VALID_CHARS.length;}return new String(sortUrl);}public String generate(String url) {String shortUrl;shortUrl = generate(url, random.nextInt(Integer.MAX_VALUE));while (seek(shortUrl) != null) {shortUrl = generate(url, random.nextInt(Integer.MAX_VALUE));}put(url, shortUrl);return shortUrl;}}

实际的需要在数据库层实现,这里在内存里面存储的实现一个意思一下

import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 内存存储的实现* <p>* Created by luoguo on 2017/3/16.*/
public class UrlShortenerMemory extends AbstractUrlShortener {private Map<String, String> url2ShortUrl = new ConcurrentHashMap<String, String>();private Map<String, String> shortUrl2Url = new ConcurrentHashMap<String, String>();public UrlShortenerMemory() {super();}public UrlShortenerMemory(int length) {super(length);}public void put(String url, String shortUrl) {url2ShortUrl.put(url, shortUrl);shortUrl2Url.put(shortUrl, url);}public String seek(String shortUrl) {return shortUrl2Url.get(shortUrl);}public void clean(String url) {String sortUrl = url2ShortUrl.get(url);if (sortUrl != null) {url2ShortUrl.remove(url);shortUrl2Url.remove(sortUrl);}}public void clean(Date date) {throw new UnsupportedOperationException();}}

弄点测试代码,试试看效果怎么样

public class UrlShortenerTest {public static void main(String[] args) {for(int j=1;j<10;j++) {UrlShortener urlShortener = new UrlShortenerMemory(j);for (int i = 0; i < 5; i++) {System.out.println(urlShortener.get("http://www.tinygroup.org"));}System.out.println();}}
}

这里是运行结果

T
Q
l
i
I0R
VB
fN
so
Nwfw1
fpu
WT7
pNL
M5V0cZF
H09A
AjYM
1AMf
sdkzUSsgK
ZMn9U
7S48u
oBb1L
yB14gDRVGWg
gh3oJa
BapdY7
yJgcZj
mivGN3TEiQG2M
8SkokOY
NZww5GT
fxloZ0R
hkiOpID3ZpdIYrF
eFlSSDyd
bB4RCFgE
25mceTMK
AAJ2Lp6S5IUVoFSqZ
zHZeuZljY
njCGDBKVs
IgH21Tg5V
WvGCy5ZtE

感觉还可以,当然里面还有一些不完善的地方

  1. 当产生的数量达到一定程度的时候,再获取时由于冲突比较大,导致性能会降低
  2. 因此如果是小型系统,建议采用4个长度,大型系统建议采用6个长度
  3. 现在还没有多长时间之后自动失效的API,建议添加
  4. 需要实现支持序列化的方案
  5. 现在没有同步处理,实际实现中需要考虑

这个只是化几分钟展示一个思路,并没有经过系统的思考的验证,正式系统请慎重使用。

更多精彩技术博文,请看本人博客空间

转载于:https://my.oschina.net/tinyframework/blog/861014

长URL转短连接的简单设计与实现相关推荐

  1. HTTP长链接与短连接?

    目录 前言 1. 长链接是什么? RST包是什么? 2. 长链接的过期时间 3.长连接的数据传输完成识别 4.TCP通道复用(长连接)并发连接数的数量限制 5.容易混淆的概念--TCP的keep al ...

  2. 新浪短链接服务Android,新浪长链接转短连接API

    /** * URL地址长短切换,由sina新浪短链接API生成 * User: chenqt * Date: 2016/8/23 * Time: 18:45 */ class UrlSwitch { ...

  3. 前端通过【bitly】Api,将长链接转换短连接

    需求描述:我们需要将用户输入的内容,拼接我们定义好的内容生成一个短连接,并可以登录. 因为之前也没有搞过哦,所以评审结束完之后我就把当前的需求描述给ChatGPT,不得不说,这玩意确实好用啊,让你的工 ...

  4. 如何长URL转换为短URL

    转载自:https://blog.csdn.net/bntX2jSQfEHy7/article/details/80045503 短地址的好处 (1)节省网址长度,便于社交化传播,一个是让URL更短小 ...

  5. Android使用bit.ly的api获取url 短连接

    bit.ly相比起twitter和google的短连接服务,使用起来更为简单(谷歌的弄了一晚上也没弄出来)而且使用的是get方法,测试和上手都比较容易,下面是使用android 原生类写的通过长url ...

  6. URL生成短链接API接口

    1.前言 URL生成短链接口,可将长链接生成短链,方便分发和推广. 查看接口完整信息:https://www.idmayi.com/doc/detail?id=26 2.接口明细 注意:app_id和 ...

  7. golang 短连接和长连接 超时处理

    作为一个可能会和很多Client进行通讯交互的Server,首先要保证的就是整个Server运行状态的稳定性,因此在和Client建立连接通讯的时候,确保连接的及时断开非常重要,否则一旦和多个客户端建 ...

  8. [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)

    通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...

  9. 长连接、短连接、短轮询、长轮询

    长连接.短连接.短轮询.长轮询 短连接:每次Http请求都会建立Tcp连接,管理容易 长连接:只需要建立一次Tcp连接,以后Http请求重复使用同一个Tcp连接,管理难 短轮询:重复发送Http请求, ...

最新文章

  1. 人工脑连接体:类脑人工智能的奇点时刻来临
  2. python交互界面的退出
  3. 并查集hdu1232
  4. facebook 面试_我在Facebook接受了应届毕业生的面试。 这是我从设计中学到的东西。...
  5. 微信游戏脑力大乱斗92一个计算机,微信脑力大乱斗答案大全_全关卡图文攻略_软吧...
  6. ubutn下安装英伟达显卡驱动
  7. 全新设计的 Xcode 12
  8. java fx 按钮长度_JavaFX按钮
  9. mysql hibernate 乱码_mysql hibernate 乱码
  10. BatchPhoto Pro for Mac(照片批量处理软件)
  11. marlab中主成分得分怎么求_8款洁面泡沫洗面奶大评测,成分分析以及适用肤质介绍...
  12. sqlserver2012下载地址
  13. 网络子系统33_网桥设备的配置更新
  14. 【Python机器学习】梯度下降法(三) 优矿(uqer.io)
  15. 大学英语综合教程三 Unit 1 课文内容英译中 中英翻译
  16. 关于徐晓东,传统武术,以及太极拳
  17. 使用JBE修改.class字节码文件
  18. redis crackit入侵事件总结
  19. PS cc 2018分享
  20. Code Review的基本思路

热门文章

  1. Apriori算法简介---关联规则的频繁项集算法
  2. IBM转型认知计算和云平台
  3. 2021-03-15 scala map 小括号与大括号
  4. linux下scp命令的使用
  5. mount修改/dev/shm的大小
  6. 【AssetBundle】七:打包生成的manifest文件
  7. 自制小爱音箱控制氛围灯(小爱音箱+Arduino+RGB灯条+点灯科技)
  8. java实现拉丁方块填数字
  9. ai作文批改_AI批改作文哪家强?英语老师亲测讯飞智能学习机更高效
  10. IDT代理——北京泽平科技CRISPR基因编辑