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