UDN-企业互联网技术人气社区

板块导航

浏览  : 793
回复  : 4

[Nodejs] 造轮子系列之——短链接服务

[复制链接]
白青青的头像 楼主
发表于 2017-1-3 15:17:44 | 显示全部楼层 |阅读模式
1.png

  网上已经有很多短链接服务了,但我司业务是海内外并存,用两种短链服务有点不太合理,于是乎开始自己造轮子

  一,技术栈


  二,思路

  • express做web服务器,
  • 处理请求使用redis的inc方法维护一个自增id
  • 通过base58将该id做encoding
  • 使用编码的hash作为redis的key存储原始url及其他信息
  • 访问时查询hash获取原始url并更新访问次数等信息

  三,界面
1.png

  四,其他
  1. var Base58Builder = (function() {
  2.   function Base58Builder() {
  3.     this.alphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
  4.     this.base = this.alphabet.length;
  5.   }

  6.   Base58Builder.prototype.encode = function(num) {
  7.     var mod, str;
  8.     if (!/^\d+$/.test(num)) {
  9.       throw new Error('Value passed is not an integer.');
  10.     }
  11.     if (typeof num !== 'number') {
  12.       num = parseInt(num);
  13.     }
  14.     str = '';
  15.     while (num >= this.base) {
  16.       mod = num % this.base;
  17.       str = this.alphabet[mod] + str;
  18.       num = (num - mod) / this.base;
  19.     }
  20.     return this.alphabet[num] + str;
  21.   };

  22.   return Base58Builder;

  23. })();

  24. module.exports = new Base58Builder();
复制代码

  stackoverflow上被采纳的答案解释的更清楚一些:

  You need a Bijective Functionf. This is necessary so that you can find a inverse function g('abc') = 123 for your f(123) = 'abc' function. This means:

  There must be no x1, x2 (with x1 ≠ x2) that will make f(x1) = f(x2),

  and for every y you must be able to find an x so that f(x) = y.

  How to convert the ID to a shortened URL

  Think of an alphabet we want to use. In your case that's [a-zA-Z0-9]. It contains 62 letters.

  Take an auto-generated, unique numerical key (the auto-incremented id of a MySQL table for example).

  For this example I will use 12510 (125 with a base of 10).

  Now you have to convert 12510 to X62 (base 62).

  12510 = 2×62

  1

  + 1×62

  0

  = [2,1]

  This requires use of integer division and modulo. A pseudo-code example:
  1. digits = []

  2. while num > 0
  3.   remainder = modulo(num, 62)
  4.   digits.push(remainder)
  5.   num = divide(num, 62)

  6. digits = digits.reverse
复制代码

  Now map the indices 2 and 1 to your alphabet. This is how your mapping (with an array for example) could look like:
  1. 0  → a
  2. 1  → b
  3. ...
  4. 25 → z
  5. ...
  6. 52 → 0
  7. 61 → 9
  8. With 2 → c and 1 → b you will receive cb62 as the shortened URL.

  9. http://shor.ty/cb
复制代码

  How to resolve a shortened URL to the initial ID

  The reverse is even easier. You just do a reverse lookup in your alphabet.

  e9a62 will be resolved to "4th, 61st, and 0th letter in alphabet".

  e9a62 = [4,61,0] = 4×62

  2

  + 61×62

  1

  + 0×62

  0

  = 1915810

  Now find your database-record with WHERE id = 19158 and do the redirect.

  因为是暂时还部署在一台测试服务器,为防止数据丢失,加了白名单限制,限制使用,去掉logstash和私有信息后分享代码到github。

相关帖子

发表于 2017-1-3 15:18:12 | 显示全部楼层
LZ是闲人,天天发帖,坚定完毕
使用道具 举报

回复

发表于 2017-1-3 15:18:13 | 显示全部楼层
LZ是闲人,天天发帖,坚定完毕
使用道具 举报

回复

发表于 2017-1-3 15:18:15 | 显示全部楼层
js是要逆天的节奏js虽然不错,但是天生也是有缺陷,局限性。。。
使用道具 举报

回复

发表于 2017-1-3 15:18:15 | 显示全部楼层
jq现在应该算是最火的js框架类了吧?确实很强大extjs基于Yahoo UI的扩展,界面布局和效果方面很给力,但就是有点复杂
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部