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

一个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

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

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-02-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang

influxdb 简介与实现(一)

InfluxDB是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及执行分析。

31340
来自专栏潇涧技术专栏

How to get performance data in Android

读取文件节点/proc/loadavg,分别是1min/5min/15min内CPU的负载情况。 读取方式的代码示例:

10120
来自专栏雪胖纸的玩蛇日常

54.1 怎样才算学会django? 知道这28个知识点才算会django2

25350
来自专栏技术小黑屋

一个简易小工具,七牛Uploader for Octopress

春节假期,带着电脑回家,蹭着邻居的网,除夕晚上用ruby写了一个简单的工具。安利一下,广而告之。

11530
来自专栏java思维导图

缓存穿透,缓存击穿,缓存雪崩解决方案分析

设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。

15730
来自专栏腾讯数据库技术

谁在攻击我的数据库?审计功能大揭密

65220
来自专栏小狼的世界

Curl操作Elasticsearch的常用方法

Elasticsearch对于文档操作,提供了以下几种API,本文就说明如何使用curl方式来调用这些API。

16720
来自专栏Golang语言社区

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

一个go语言实现的短链接服务 首先,博客转移到 wusay.org 了,去年没交费,博客都没了。。。刚刚恢复过来,以前的文章没了,慢慢补吧。 什么是短链接服务 ...

669100
来自专栏腾讯云数据库(TencentDB)

【腾讯云CDB】MySQL审计功能大揭秘

        对于一个仓库,如果要防盗, 常见做法是出入口全装上监控,一旦有问题了,调监控查找异常情况。对数据库来说也类似,数据库也有出入口,对所有连接出入口...

1.4K00
来自专栏小狼的世界

在Codeigniter框架中使用NuSOAP

NuSOAP 是一组功能强大的PHP类,这个工具的发布让使用和创建SOAP消息变得相当简单。 NuSOAP有Dirtrich Ayala编写,可以无缝的与许多最...

9510

扫码关注云+社区

领取腾讯云代金券