短链服务架构实践


1.存储采用REDIS做数据存储

2.id/keyword -> long_url

 hset key_long_url id/keyword  long_url

3. md5(long_url) -> id/keyword

  hset key_short_url md5(long_url)  id/keyword -> 用来判断长链是否已经被转过了,如果是直接返回对应的短链,如果不是开始转短链并双向存储。

4. id -> keyword (数字ID到字符串的转换算法)

    /** 
     * 数字与字符串的映射, 不能以数字0开头自定义短链
     * @param int or string $input
     * @param boolean $toNum default false
     * @return string/int
     */
    public static function alphaId($input, $toNum = false) {
        $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        if ($toNum) {
            $integer = 0;
            $string = $input;
            $string = strrev( $string  );  
            $baselen = strlen( $chars );
            $inputlen = strlen( $string );
            for ($i = 0; $i < $inputlen; $i++) {
                $index = strpos( $chars, $string[$i] );
                $integer = bcadd( $integer, bcmul( $index, bcpow( $baselen, $i ) ) );
            }   
            return $integer;
        } else {
            $string = ''; 
            $num = $input;
            $len = strlen( $chars );
            while( $num >= $len ) { 
                $mod = bcmod( $num, $len );
                $num = bcdiv( $num, $len );
                $string = $chars[ $mod ] . $string;
            }   
            $string = $chars[ intval( $num ) ] . $string;
    
            return $string;
        }   
    }

  

5. id生成器 hset allocate short_url_id 100000000

你可能感兴趣的:(深入理解PHP内核,redis,PHP)