正好看到这篇文章 ,而且他也是用PHP的。所以就转一下,而且我自己也有一些短域名,可以用来做尝试。就象最近,新浪的围脖上,如果你贴了网站,他都会转成sinaurl的,这样对于新浪来说又多了一个PV。
原文如下
近来微博很火,因为字数的限制,出现了很多网址缩短这种服务,比如sina自己用了自家的sinaurl.cn,想到自己曾经也注册了一个很短的域名k6.hk很久了,一直闲着,不知道干嘛用,突然想到可以用来做网址缩短,还不错。说干就干,一会就写好了。比如我的博客地址就可以缩短成:http://k6.hk/u
程序的设计很简单,下面说下原理,
数据库只有两个字段seq(自增长数字)和url(数字的url地址,建立索引)。
用户输入一个url地址,查询表是否包含此url,如果存在,则返回seq的数字,
如果不存在,则插入数据库,得到一个新增加的自增seq数字,为了缩短数字占用的字符数,我们可以把abc等字母的大小写用上。这样10个数字,26个 小写字母,26个大小字母就组成了一个62进制了。比如数字10000000000(100亿)转换后就是aUKYOA,只有6位了,这样就能缩短很多的 网址了。
下面是php的进制转换代码,来源于php手册(简单吧),当然其他语言实现也是很简单的,
- <?php
- //十进制转到其他制
- function dec2any( $num, $base=62, $index=false ) {
- if (! $base ) {
- $base = strlen( $index );
- } else if (! $index ) {
- $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base );
- }
- $out = "";
- for ( $t = floor( log10( $num ) / log10( $base ) ); $t >= 0; $t-- ) {
- $a = floor( $num / pow( $base, $t ) );
- $out = $out . substr( $index, $a, 1 );
- $num = $num - ( $a * pow( $base, $t ) );
- }
- return $out;
- }
- function any2dec( $num, $base=62, $index=false ) {
- if (! $base ) {
- $base = strlen( $index );
- } else if (! $index ) {
- $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 0, $base );
- }
- $out = 0;
- $len = strlen( $num ) - 1;
- for ( $t = 0; $t <= $len; $t++ ) {
- $out = $out + strpos( $index, substr( $num, $t, 1 ) ) * pow( $base, $len - $t );
- }
- return $out;
- }
如果改下ttserver的源代码,通过ttserver的http接口直接跳转,那么性能将会非常高,一台机器一天提供上10亿次的中专都不是问题。用两台机器就可以实现高可用了,这种服务都不怎么耗费流量的。
--EOF--
我倒是不太清楚这个ttserver,但是我想,如果安装了memcached,也会很不错的。首次命中后直接存在memcached里,下次就可以直接访问了。当然更可以做的是,完全生成相应的跳转文件。这样就比较无耻一点了。