本项目就是一个短链接项目,每次新增短链接的时候会在缓存里面存放一段时间,在失效时间内如果有新的请求过来 获取相同短链接则从缓存中拿,支持本地缓存和分布式缓存。这一方面也减少短链接的重复性。
因为如果根据数据库判重的话,需要对url判重。url有可能很长,加上索引都超过了InnoDB引擎索引支持最大长度3072Bytes,从而 无法加索引,而且索引长度也很长,查询性能不好。如果需要判重,每次都要查询一次数据库,对IO性能也有一定影响,所以选择 缓存新短链接一段时间的做法比较妥当。
其实我也想过使用md5签名来处理url,如果遇到重复再次使用url来查询,也能算一种优化。但是缺点还是可能会对MySQL多次IO, 性能不好,并且客人使用同一条短链接真的可能只是一两天甚至一两个小时,所以也没选择这种做法。因为客人使用同一条短链接真的可能只是一两天甚至一两个小时,所以造成重复url不会太多。假设数量增加不少,几千万甚至几亿,对 单表性能不好,可以通过分库分表,比如对hash(id),把id分散到不同的表中;也可以通过range分表,每张表保存id序列号在某个 数值范围。