产品要求:
设计一个类似TinyURL的服务来缩短链接长度。用户在访问短链接时可以自动跳转到长链接。
思考:
使用md5算法生成一个32位签名字符串,该字符串分为4段,每段有8个字符
对于这四段,取每段8个字符,作为十六进制字符串和0x3fffffff的位和运算,忽略30多位
将每段得到的30位分成6段,每5位数字作为字母表的索引,得到特定的字符,依次得到6位字符串
这样的md5字符串可以得到四个6位字符串,其中任何一个都可以用作这个长url的短url地址
结果是独一无二的,但是我们可以拿出4组,所以重复的会很少
密钥可以定制为在MD5加密字符传输之前生成混合密钥
工具类
实体类
桌子
几百亿的短链接可以生成,但不排除100%不会重复,概率极小,目前我用的毫秒级混合键。
它还可以用作唯一的识别码等。
如果重复呢?
没有检查数据库是否存在。如果并发过高,会给数据库带来压力。因此,如果您添加了一个唯一的索引,您可以报告一个错误并基本上传递一次。
为了反复添加错误后再重新添加,在四组短链接用完时,采用了雪花算法,这是Twitter的开源分布式id生成算法。
如果是分布式环境,则需要设置自己的数据中心数据中心Id或机器码machineId。
雪花算法生成的id是18位,这里转换为62位,长度为10,比getShortUri多4位。考虑你自己的平衡
ShortUriPrefix是短链接之前的路径,我这里设置的是/g之前的路径,比如有业务区分,我这里就用/g。当然也可以用/xx等。,并尝试用一个字母替换它。毕竟,这是一个短暂的环节
最终效果存储在mysql中
最终设计: