艺术~为减少字符设计的短URL服务

设计原因

之前需要写一个告警服务,告警需要一短信的方式通知对方,并且在短信中要给到监控报告的URL地址, 但是发送短信需要调用三大运营商的接口,短信息有字数限制的,发送一条短信最多七十个字,160个英文或数字字符,或者70个中文字符,也就说,你每次发信息,你发送超过70字的短信是按2条记费的,超过140个字按3条记费,依次类推。

设计好处

  1. 减少短信内容,为公司降低开销
  2. 好看。 比起一大堆不知所以的参数,短链接更加简洁友好。
  3. 安全。 不暴露访问参数。

核心原理

  • 其实本质就是把长的url做一个映射, 变成一个短的url,将这个短的URL发送给用户, 当用户点击这个短的url的时候,进入对应域名下的服务获取到其对应的长的url,然后进行重定向,最后展示内容
  • 主要集中于如何将一个长URL对应到短URL上。

服务设计

  • 长短url的实际存储我还是使用mysql进行存储的,长url直接存储在mysql中, 而自增主键就是其对应的短url
  • 单单是上述做法有个问题就是如果同一个长url发送俩次对应的是俩天不同的短url,这样设计是不合理的,第一个来的URL返回"www.x.cn/0",第二个相同的长url返回"www.x.cn/1"。
  • 所以我在mysql上设计了一层缓存,并且每次写mysql的时候都要查一次就是已经存储过,设计缓存的目的还有一个就是mysql的qps有点低,加了缓存我就想读请求尽量在redis上就能命中
  • 如果把所有短url存储在redis中显然是不合理的, 所以我给redis上存储的每一天数据都给了1小时的过期时间
  • 还有一点就是发送短url时候发送mysql的自增主键数字显然是不合理的,不美观,所以我将自增主键的数字进行一一拆分, 比如12 拆分为1和2,然后分别加上97转换成字符进行发送
  • 当用户点击短url的时候,我获取到url后面的字符串,对其每个字符进行减97变成数字,然后先在redis上查,如果找到就直接进行重定向,设置过期时间为1小时,如果没有找到再去mysql中进行查找,其使用的就是自增主键id进行查找,所以效率还算可以,找到后写入redis并且设置过期时间一小时。
  • 其实我们这个服务目前只是一个单体的,有挂的风险,如果要使用集群的方式,我们可以换一种思路,可以有两个发号器(也就是俩个mysql),一个发单号,一个发双号,发号之后不再是递增1,而是递增2。后续还想扩展,那就三个发号器,每次递增3… 以此类推

你可能感兴趣的:(艺术)