一个go语言实现的短链接服务

原创 2015年06月16日 18:46:27

一个go语言实现的短链接服务

首先,博客转移到 wusay.org 了,去年没交费,博客都没了。。。刚刚恢复过来,以前的文章没了,慢慢补吧。

什么是短链接服务

大家都用过新浪微博的短连接吧,就是t.cn后面一串不知道是什么的数,然后跳转到一个新页面去,具体什么是短连接请大家自行脑补,在这里,目前有很多提供短连接的地方,比如狼厂的短连接服务,还有提供很多短链接的在线服务,比如这个,能生成很多地方的短连接。

巴特,作为一个程序员,我们不止需要一个端链接服务,我需要自己实现一个短连接服务,因为一般的公共的短连接都有token要求,每天生成的链接也有限制,当你需要生成大量短连接的时候就比较麻烦了。

所以,我实现了一个短连接服务。

短连接的原理

很多人一定想的是短连接是通过一定的算法将长链接变成短连接的,然后访问的时候再还原,恩,非常高大上,但是仔细想想,怎么可能,那得多牛逼的压缩算法,多长的url都可以压缩为几个字节,而且还能还原,还是无损压缩。

所以,实际上,短连接生成核心就两个字:数数,就是不停的自增一个数,然后有个表保存每个数和原始链接的对应关系,访问短连接的时候将原是连接取出来。

知道了原理就好弄了,最简单的办法,就是用一个数组来存储,数组的索引就是短链接,数组的值就是原始链接,恩,完美,由于数组下标是短链接,那么获取短链接的时间复杂度是O(1),同时生成短链接的时间复杂度也是O(1)

短链接服务的实现

实现一个短链接服务,用数组固然可能,但也显得太LOW了吧,所以为了实现这个服务,从以下几个部分来实现。

首先,给两个概念

  • 解析短链接,就是请求是短连接,返回一个跳转的原始链接
  • 生成短链接,就是有个长链接,返回生成的短链接

存储

持久化的部分使用Redis数据库来实现,很明显,key-value的结构很适合存在Redis中
这部分主要在 shortlib/RedisAdaptor.go中

计数器

数数的功能可以用Redis的自增功能实现,这样也保证了原子性,同样这部分也可以自己实现,因为go语言开线程很容易,专门开一个线程实现这个功能,通过channl来接受请求,保证是串行的就行了,不就是数数嘛,大家都会
这部分在shortlib/RedisAdaptor.go和shortService/CountThread.go中,具体实现的时候通过配置文件的参数,返回一个高阶函数,调用的时候自动分配到不同的函数实现。

缓存服务

Redis固然很快,但是我们还需要更快,要是热门数据存在内存中就更快了,而且还有个问题,就是热门的url要是有人不停的申请短连接会造成浪费,为了防止这个问题,自己实现了一个LRU模块,解析短链接的时候,命中了话直接返回结果,否则从Redis返回数据,如果是申请短链接的话,如果在LRU中,那不再重新生成短链接了。
这部分主要在 shortlib/LRU.go中。

对外服务

这一部分用的go的http框架,很容易实现高并发,没啥好说的,现在编程高并发不是问题了,连语言都自带这框架了。
这部分包括shortlib/Router.go , shortService/OriginalProcessor.go,shortService/ShortProcessor.go 这几个文件。

代码位置

具体可以参考github,代码已经传上来了,800多行代码,没多少,感兴趣的可以自己去看看,欢迎提交BUG

性能测试还没做,等把代码全完成以后再测测性能。

版权声明:本文为博主原创文章,未经博主允许不得转载。

短链接服务架构设计与实现

场景 ​ 短链接服务就是将一段长的URL转换为短的URL,比如利用新浪微博的短链接生成器,可将一段长的URL(http://blog.csdn.net/poem_qianmo/article/d...
  • lz0426001
  • lz0426001
  • 2016年08月30日 16:02
  • 3071

一个go语言实现的短链接服务

一个go语言实现的短链接服务。大家都用过新浪微博的短连接吧,就是t.cn后面一串不知道是什么的数,然后跳转到一个新页面去,这是怎么实现的呢?...
  • ygrx
  • ygrx
  • 2015年06月16日 18:46
  • 2422

如何实现支持数亿用户的长连消息系统 | Golang高并发案例

此文是根据周洋在【高可用架构群】中的分享内容整理而成,转发请注明出处。 周洋,360手机助手技术经理及架构师,负责360长连接消息系统,360手机助手架构的开发与维护。 不知道咱们群名什么时候改为...
  • RandyLeonard
  • RandyLeonard
  • 2016年01月18日 16:52
  • 7757

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

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

短链接服务架构设计与实现

场景 ​ 短链接服务就是将一段长的URL转换为短的URL,比如利用新浪微博的短链接生成器,可将一段长的URL(http://blog.csdn.net/poem_qianmo/article/d...
  • lz0426001
  • lz0426001
  • 2016年08月30日 16:02
  • 3071

短链接服务的接实现 基于nginx url php redis 、js二维码生成 、js二维码识别

很容易想明白短链接是怎么实现的,无非就是把很长的URL存到服务器上,和一个短的url做一个映射。要做一个短链接,有一个很短的域名当然是再好不过了,信浪微博的短域名t.cn就短到了极致,自己申请短域名的...
  • sinat_34820292
  • sinat_34820292
  • 2017年11月20日 15:15
  • 110

调用新浪网址缩短服务生成网址短链接

调用新浪网址缩短服务生成网址短链接// POJO类/** * Created by 谭健 on 2017/10/17. 13:59. * © All Rights Reserved. */ pu...
  • qq_15071263
  • qq_15071263
  • 2017年10月19日 11:40
  • 602

WEB:建立短链接服务

现有在线服务在实现分享功能的时候特别需要短链接服务,已有的在线url shorten服务包括:1. TinyUrl,API地址 http://tinyurl.com/api-create.php?ur...
  • iefreer
  • iefreer
  • 2014年03月30日 14:57
  • 4930

百度 谷歌 Twitter,这么多短链接服务(Short Url)到底哪家强?

一、短链接是什么短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。 它的原理也非常简单,就是采用 Domain Redirect(域名重定向) ,将一个域名自动跳转...
  • imanapple
  • imanapple
  • 2015年08月21日 13:37
  • 5554

短链接服务商Bitly推出名为RealTime的“互联网热点发掘引擎”

提供网址和链接缩短、分享和跟踪服务的创业公司Bitly最近推出一项名叫Realtime的“互联网注意力排序引擎”,通过这个引擎你可以分析此时此刻互联网上最热的话题是什么。你还可以通过主题、短语、域名、...
  • zhoubl668
  • zhoubl668
  • 2012年08月02日 18:01
  • 831
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个go语言实现的短链接服务
举报原因:
原因补充:

(最多只允许输入30个字)