短Url 系统设计

方案一:自己写算法,把长Url 转换为短的   1--10,A--Z,a--Z  62个元素。这有点难啊,需要跑多久。并且对方输入的URL长度的不固定,所以,很难。

方案二:表的映射,使用K-V,形式。一个短的Key,去映射长的URL,长的url依然还是那个url,只不过起了一个外号(别名)。

注意:1.key的唯一性,

      MY function :我采用的是方案二,项目背景(公司的项目中使用,暂且不考虑恶意生成,模拟真实请求,生成短链接,占用数据池)。

实现,获取长连接值,通过MD5函数(压缩),当作Key,为了防止重复,我们再加上时间戳,这样就有效的防止key的重复。

可能此处有人认为,这个生成的链接也不是太短。的确,在项目中发现,带上域名,再带上key,这样以来也不是太短,不过可以保证在100以内。

为了优化,我们可以考虑用最短的域名,然后后面的key,可以不用MD5,可以用插入之后返回的自增id,来当作唯一的key。自增主键索引,就保证了key的唯一性。这样也有效。方法的实现的宗旨就是映射,保证K-V一一对应。

再次优化,针对并发的操作,可以使用队列,或者加锁,或则分库分表。假如有两个库,那么就求摸,来增加。

代码很简单,主要是实现思路,我的可能有没考虑到的地方,多多指教。

 

/**
 * @param $url
 * Name: ShortUrl
 * Date: 2018-02-05
 * Explain:短链接服务    替换百度短链接服务
 */
function WeizaojiaoShortUrl($url,$org_id = '0'){

    $new_longUrl = $url.time();
    $new_key = md5($new_longUrl);
    //入映射表
    if($new_longUrl){
        $data['orgid'] = $org_id;
        $data['key'] = $new_key;
        $data['value'] = $url;
        $data['num'] = 0;
        $addTable = M('ShortUrl')->add($data);
        if($addTable){
            return $shortUrl = 'http://csdn.cn/?key='.$data['key'];
        }else{
            return "error";
        }
    }else{
        return "error";
    }
}
public function index(){
    $key = I('key');

    if($key){
        $new_url = M('ShortUrl')->where(array('key'=>$key))->getField('value');
        M('ShortUrl')->where(array('key'=>$key))->setInc('url_cnt');
        if($new_url){
            header("Location:$new_url");exit();
        }else{
            echo "error";die;
        }
    }

}

原来用的是百度,但是有的时候不可以,所以自己写一个,自己的项目用。

 

 

你可能感兴趣的:(PHP)