短URL服务 设计及成功! 高性能

  • 电脑网络维修
  • 2024-11-15

为什么这外面的url都是短的呢?有什么好处呢?怎样做到的呢?

短url的好处有:

短. 短信和许多平台(微博)有字数限度,太长的链接加出来都没有方法写注释了。

难看. 比起一大堆不知所以的参数,短链接愈加繁复友好。

繁难做一些统计.你点了链接会有人记载而后剖析的。

安保. 不泄露访问参数。

这就是为什么咱们如今收到的渣滓短信大少数都是短URL的要素了。

那么短URL是怎样做到的呢?

短URL基础原理

短URL从生成到经常使用分为以下几步:

有一个服务,将要发送给你的长URL对应到一个短URL上.例如www.baidu.com -> www.t.cn/1。

把短url拼接到短信等的内容上发送。

用户点击短URL,阅读器用301/302启动重定向,访问到对应的长URL。

展现对应的内容。

本文关键集中于第一步,即如何将一个长URL对应到短URL上。

服务设计

假设你在往长短URL实在的对应相翻开想,那么就走远了。

最现实的状况是: 咱们用一种算法,对每一个长URL,惟一的转换成短URL.还能坚持反向转换的才干。

然而这是无法能的,假设有这样的算法,环球上的一切紧缩算法都可以原地逝世了。

正确的思绪是建设一个发号器,每次有一个新的长URL出去,咱们就参与一,并且将新的数值前往.第一个来的url前往"www.x.cn/0",第二个前往"www.x.cn/1"。

接上去以QA方式写几个小疑问:

对应相关如何存储?

这个对应数据必需是要落盘的,不能每次系统重启就从新排号,所以可以驳回mysql等数据库来存储.而且假设数据量小且qps低,间接经常使用数据库的自增主键就可以成功

如何保障长短链接逐一对应?

依照下面的发号器战略,是不能保障长短链接的逐一对应的,你延续用同一个URL恳求两次,结果值都是不一样的。

为了成功长短链接逐一对应,咱们须要付出很大的空间代价,尤其是为了极速照应,咱们可以须要在内存中做一层缓存,这样子太糜费了。

然而可以成功一些变种的,来成功局部的逐一对应, 比如将最近/最抢手的对应相关存储在K-V数据库中,这样子可以节俭空间的同时,放慢照应速度。

短URL的存储

咱们前往的短URL普通是将数字转换成32进制,这样子可以愈加有效的缩短URL长度,那么32进制的数字对计算机来说只是字符串,怎样存储呢?间接存储字符串平等值查找好找,对范畴查找等太不友好了。

其实可以间接存储10进制的数字,这样不只占用空间少,对查找的支持较好,同时还可以愈加繁难的转换到更多/更少的进制来进一步缩短URL。

高并发

假设间接存储在MySQL中,当并发恳求增大,对数据库的压力太大,或许会形成瓶颈,这时刻是可以有一些优化的。

缓存

下面保障长短链接逐一对应中也提到过缓存,这里咱们是为了放慢程序解决速度.可以将抢手的长链接(须要对长链接出去的次数启动计数),最近的长链接(可以经常使用redis保留最近一个小时的)等等启动一个缓存,保留在内存中或许相似redis的内存数据库中,假设恳求的长URL命中了缓存,那么间接失掉对应的短URL启动前往,不须要再启动生成操作。

批量发号

每一次性发号都须要访问一次性MySQL来失掉的最大号码,并且在失掉之后降级最大号码,这个压力是比拟大的。

咱们可以每次从数据库失掉10000个号码,而后在内存中启动发放,当残余的号码无余1000时,从新向MySQL恳求下10000个号码.在上一批号码发放完了之后,批量启动写入。

这样可以将对数据库继续的操作移到代码中启动,并且异步启动失掉和写入操作,保障服务的继续高并发。

散布式

下面设计的系统是有单点的,那就是发号器是个单点,容易挂掉。

可以驳回散布式服务,散布式的话,假设每一个发号器启动发号之后都须要同步给其余发号器,那未必也太费事了。

换一种思绪,可以有两个发号器,一个发单号,一个发双号,发号之后不再是递增1,而是递增2。

类比可得,咱们可以用1000个服务,区分发放0-999尾号的数字,每次发号之后递增1000.这样做很繁难,服务相互之间基本都不用通讯,做好自己的事情就好了。

成功

因为我懒得写JDBC代码,更懒得弄Mybatis,所以代码中经常使用到MySQL的中央都经常使用了Redis。

package util;import redis.clients.jedis.Jedis;public class ShortUrlUtil {private static final String SHORT_URL_KEY = "SHORT_URL_KEY";private static final String LOCALHOST = "http://localhost:4444/";private static final String SHORT_LONG_PREFIX = "short_long_prefix_";private static final String CACHE_KEY_PREFIX = "cache_key_prefix_";private static final int CACHE_SECONDS = 1 * 60 * 60;private final String redisConfig;private final Jedis jedis;public ShortUrlUtil(String redisConfig) {this.redisConfig = redisConfig;this.jedis = new Jedis(this.redisConfig);}public String getShortUrl(String longUrl, Decimal decimal) {// 查问缓存String cache = jedis.get(CACHE_KEY_PREFIX + longUrl);if (cache != null) {return LOCALHOST + toOtherBaseString(Long.valueOf(cache), decimal.x);}// 自增long num = jedis.incr(SHORT_URL_KEY);// 在数据库中保留短-长URL的映射相关,可以保留在MySQL中jedis.set(SHORT_LONG_PREFIX + num, longUrl);// 写入缓存jedis.setex(CACHE_KEY_PREFIX + longUrl, CACHE_SECONDS, String.valueOf(num));return LOCALHOST + toOtherBaseString(num, decimal.x);}/*** 在进制示意中的字符汇合*/final static char[] digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8','9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};/*** 由10进制的数字转换到其余进制*/private String toOtherBaseString(long n, int base) {long num = 0;if (n < 0) {num = ((long) 2 * 0x7fffffff) + n + 2;} else {num = n;}char[] buf = new char[32];int charPos = 32;while ((num / base) > 0) {buf[--charPos] = digits[(int) (num % base)];num /= base;}buf[--charPos] = digits[(int) (num % base)];return new String(buf, charPos, (32 - charPos));}enum Decimal {D32(32),D64(64);int x;Decimal(int x) {this.x = x;}}public static void main(String[] args) {for (int i = 0; i < 100; i++) {System.out.println(new ShortUrlUtil("localhost").getShortUrl("www.baidudu.com", Decimal.D32));System.out.println(new ShortUrlUtil("localhost").getShortUrl("www.baidu.com", Decimal.D64));}}}
  • 关注微信

本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/6653.html

猜你喜欢

热门标签

洗手盆如何疏浚梗塞 洗手盆为何梗塞 iPhone提价霸占4G市场等于原价8折 明码箱怎样设置明码锁 苏泊尔电饭锅保修多久 长城画龙G8253YN彩电输入指令画面变暗疑问检修 彩星彩电解除童锁方法大全 三星笔记本培修点上海 液晶显示器花屏培修视频 燃气热水器不热水要素 热水器不上班经常出现3种处置方法 无氟空调跟有氟空调有什么区别 norltz燃气热水器售后电话 大连站和大连北站哪个离周水子机场近 热水器显示屏亮显示温度不加热 铁猫牌保险箱高效开锁技巧 科技助力安保无忧 创维8R80 汽修 a1265和c3182是什么管 为什么电热水器不能即热 标致空调为什么不冷 神舟培修笔记本培修 dell1420内存更新 青岛自来水公司培修热线电话 包头美的洗衣机全国各市售后服务预定热线号码2024年修缮点降级 创维42k08rd更新 空调为什么运转异响 热水器为何会漏水 该如何处置 什么是可以自己处置的 重庆华帝售后电话 波轮洗衣机荡涤价格 鼎新热水器 留意了!不是水平疑问! 马桶产生了这5个现象 方便 极速 邢台空调移机电话上门服务 扬子空调缺点代码e4是什么疑问 宏基4736zG可以装置W11吗 奥克斯空调培修官方 为什么突然空调滴水很多 乐视s40air刷机包 未联络视的提高方向 官网培修 格力空调售后电话 皇明太阳能电话 看尚X55液晶电视进入工厂形式和软件更新方法 燃气热水器缺点代码

热门资讯

关注我们

微信公众号