如何设计短域名系统
输入可能是
一个冗长的域名,过期时间和自定义的别名
输出
自定义别名或者随机生成的短域名,在过期时间到来之前访问都可以被重定向到冗长的域名上
约束条件
1.过期后就失效
2.短域名是唯一的
3.自定义短域名长度在7个字符(不包含域名长度),由[0-9,a-z,A-Z]等字符组成
4,延迟
5.存储
如何增加过期时间处理
1.延迟惰性删除2,定时删除,维持大量定时器3.轮训删除对延迟要求高,并且存储空间占用少延迟删除在db建的表里加入过期时间的时间戳列,写入时计算读取比较,过期就删除
如何保证短域名的唯一性
写时消重
如何设置唯一id生成算法
1.uuid -》和 murmurhash 哈希以后可能不一样,但是截取的时候不能保证截取的不相同
2.设置自增id,利用数据库自增主键
单机吞吐量扛不住,可以增加负载均衡侧落,分片副本等等
延迟优化,可以在
存储层
1.存储介质,没必要用关系型,可以用持久形kv,比如rocksdb
2,构建索引,长短域名都要做索引,可以在redis做两份存储,互为kv,类似倒排索引缓存层
1.读多写少,使用缓存可以大大降低延迟,减少网络请求延迟2.对于判断长域名是否存储过,以及短域名是否分配过可以用布隆过滤器3.如果对延迟非常苛刻,可以使用本地缓存,维护一个lru业务层
1.通过尾号分片将id生成器分布式化,基于预处理的思想,给不同的维护不同区间,保证自增,但是不保证连续性
2.分布式id生成算法
可靠性
异地容灾,一主多从
安全性
1.如果自增id可能会人逐个遍历取走
2.使用murmurhash可能有哈希冲突
重定向
301永久重定向会缓存无法统计访问次数,但是会减少服务端压力选用302 因为要统计长域名的访问量