(提前申明,此文只谈技术,不谈运营)

最近疫情严重,导致副业搜索量大大的增加。而在机缘巧合之下,接触到了那种所谓的线报群。就是一个群里,定时会有各种各样的优惠链接之类的。先不说质量如何,低廉的价格就很容易让人产生看一看的欲望。

于是我百度了一下类似的情况,结果发现,这种名叫“淘宝客”的职业。在不断的研究和尝试之后,挖掘了一把更深层次的东西。

(正文开始了)

首先从上图开始吧,可以看到上图包含的两个东西,第一个是所谓的“淘口令”,第二个则是所谓的短链接。

其实这两个东西从理论上来讲,是同一个东西。我们可以起一个名字叫做映射。简单来说,就是在服务端以key-value存储一个映射关系,key代表短链接,value代表长连接。需要的时候,直接通过key获取到value的值就可以了。

举例说明:(你可以自己尝试一下,跳转位置绝对是一模一样的)

这个是长链接

https://jq.qq.com/?_wv=1027&k=cFU9YWW1

这个是生成后的短链接(具有时效性)

http://qq.cn.hn/xHS

大致流程是这样的:我复制(输入)了一个长链接,通过在线的短链接的转化后得到一个以http://qq.cn.h开头的短链接,然后我可以将该网址在互联网上进行分享和传播,其他人在访问该短网址可以进入到之前原本长网址对应的页面。

  1. 那么到底是如何才能压缩链接呢?

常见的短链接压缩算法有两种:

第一种是对 URL 进行hash运算,在得到的hash值上做进一步运算,得到一个较短的hash值。(这种方式说白了,就是给字符串进行hash加密,然后在得到hash值上再次进行运算,这样理论上得到了一个长度更短的值,但是这种情况下,URL数量不断的增加,绝对会增加冲突数量,最终导致一部分用户跳转到错误的地址上。)

第二种是通过数据库自增ID或分布式key-value系统模拟发号器进行发号压缩URL。(这种方式就比较简单了,先设置一个发号器,给每一个数据发一个号码,然后通过这个号码来映射,你说这个号码也太简单了,容易被破解?看下图,对一个数字进行进制化处理,就能满足你的条件了,如果还不行,在固定位数加上随机数字?)

(重头戏啊)

接下里我讲一讲,我当时遇到的一些坑。

1.key-value到底应该要怎么存?

其实这里我做了两种方案,一种是redis,一种是mysql。这里的基本逻辑是,在mysql里存储对应的key-value值,然后在redis里进行缓存处理,毕竟每一个生成的短链接都是不会在更改的。

2.发号器该如何设置?

其实这个比较简单,发号器的作用主要是两个:1.保障能够每一次发送唯一的字段,这样就能保障短链直接不会再次冲突。2.保证具有一定的规律性,这样方便索引。这里推荐两种形式吧:

利用数据库的自增id:这种方式很简单,流程上讲,利用id进行64进制转换,将转换后的字段作为短链key。这样能够保证key 的唯一性,且不会冲突。这种缺点也很明显,依赖于数据库的自增,整体的效率以数据库的效率为主。(附上64进制转换代码)

/**
* 把10进制的数字转换成64进制
*
* @param number
* @param shift
* @return
*/
private static String CompressNumber(long number) {char[] buf = new char[64];int charPos = 64;int radix = 1 << 6;long mask = radix - 1;do {buf[--charPos] = digits[(int) (number & mask)];number >>>= 6;} while (number != 0);return new String(buf, charPos, (64 - charPos));
}

雪花算法(没有任何两片雪花是一模一样的):雪花算法完全高可用,不依赖于数据库,而且生成数量大,每秒中能生成数百万的自增ID。而且也具有自增id,存入数据库中,索引效率高。但是这种方法依赖时间,而且长度一般为64位,虽然有一定的变种,但是短链长度仍旧很难把握。

3.并发情况下,如何提高效率。

目前高并发情况下,单一的线程很难跟得上发号问题,因此提出了2种办法。

第一种,预先发号。简单来说,每次发1000个号,放到redis里进行提前存储,然后每次需要号时候,去redis直接提取。这样就免除了数据库的效率限制。依次类推,我们可以实现1000个逻辑发号器,分别发尾号为0到999的号。每发一个号,每个发号器加1000,而不是加1。这些发号器独立工作,互不干扰即可。而且在实现上,也可以先是逻辑的,真的压力变大了,再拆分成独立的物理机器单元。1000个节点,估计对人类来说应该够用了。如果你真的还想更多,理论上也是可以的。

第二种,redis缓存。将一些常用的key-value值进行缓存,这样能够保证加载的速度。有常用的,那么就有不常用的。设计要给淘汰机制,然后把不常用的淘汰掉,剩下的就是常用的了。

更多信息,可以关注【计算机俱乐部】!

从线报群看短链接技术相关推荐

  1. 搭建短域/短链接跳转平台

    1. 什么是短链接 顾名思义,短链接即是长度较短的网址.通过短链接技术,我们可以将长度较长的链接压缩成较短的链接.并通过跳转的方式,将用户请求由短链接重定向到长链接上去.短链接主要用在短信.社交分享时 ...

  2. java 短链接url_Java 网址短链接服务原理及解决方案

    一.背景 现在在各种圈的产品各种推广地址,由于URL地址过长,不美观.不方便收藏.发布.传播以及各种发文字数限制等问题,微信.微博都在使用短链接技术.最近由于使用的三方的生成.解析短链接服务开始限制使 ...

  3. java短链接_Java 网址短链接服务原理及解决方案

    一.背景 现在在各种圈的产品各种推广地址,由于URL地址过长,不美观.不方便收藏.发布.传播以及各种发文字数限制等问题,微信.微博都在使用短链接技术.最近由于使用的三方的生成.解析短链接服务开始限制使 ...

  4. http之短链接原理分析

    1. 什么是短链接 顾名思义,短链接即是长度较短的网址.通过短链接技术,我们可以将长度较长的链接压缩成较短的链接.并通过跳转的方式,将用户请求由短链接重定向到长链接上去.短链接主要用在诸如微博,BBS ...

  5. 上美集团三次递表港交所:困于营销围城,线下渠道成短板?

    殿堂级彩妆大师Shu Uemura说:"每一张脸,都是一块充满生命力的画布.只有拥有完美的肤质,才能让艺术家在这张称之为脸的画布上创作出美丽的作品." 由于消费者对"美& ...

  6. GitChat·前端 | 从软件工程角度看大前端技术栈

    GitChat 作者:韩亦乐 前言 我们都知道,大学几乎是没有 Web 前端课的.以我所在的大学为例,唯一引导我们了解 JavaScript 的也只是'人机界面'和'Web应用开发'选修课.再者,由于 ...

  7. 从软件工程角度看大前端技术栈

    从软件工程角度看大前端技术栈 优秀人才不缺工作机会,只缺适合自己的好机会.但是他们往往没有精力从海量机会中找到最适合的那个. 100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「 ...

  8. 从Q4财报,看有道如何实现从在线教育“迷途”中脱身?

    文|螳螂观察 作者| 青月 去年,在被称作中国校外教培史上最严厉的"双减"政策发布后,不管是上市多年的好未来.新东方,还是曾经保持盈利九个季度的高途都未能幸免. 在2021-202 ...

  9. [转载] python 短网址_使用Python生成url短链接的方法

    参考链接: URL 短地址Shorteners及其Python中的API 1 用PHP和Python生成短链接服务的字符串ID 假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常 ...

  10. 什么是短链接,免费好用的短链接平台有哪些?

    免费缩短网址缩短工具,提供安全的网址缩短.短网址生成服务及稳定的短网址API接口:具有稳定.快速.安全的特点,支持批量缩短.批量短网址还原.数据报表.开放API接口等服务. 摩尔短链接 - 免费短链接 ...

最新文章

  1. POJ1466 最大点权独立集
  2. Linux网络状态工具ss命令操作详解
  3. python有效变量名_Python变量命名规则
  4. qt在visual studio 2015下的使用
  5. lt;++mysql_php+js+mysql设计的仿webQQ-lt;1gt;邮箱验证
  6. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实现字典的打印...
  7. windows date格式
  8. 鸡啄米vc++2010系列25(滚动条控件Scroll Bar)
  9. 下课拉~~~~~~~~~~~想写就写
  10. TracedModule: 更友好的模型表示方案,模型训练到部署的桥梁
  11. php快捷方式 图标ie,pubwin删除IE快捷方式并自行创建IE快捷方式的问题解决方法...
  12. 图解:麦肯锡工作术!
  13. 数组最大值/最小值计算方法
  14. 转:人最大的教养,是善待父母
  15. html5中分镜图文脚本,企业宣传片脚本如何撰写分镜头?
  16. 解决:pandas.errors.ParserError: Error tokenizing data. C error: Expected 2 fields in line 18, saw 4
  17. 哈希切割+布隆过滤器
  18. 北京大学软件与微电子学院学习经验文章集78篇和1个专题
  19. Spark与Iceberg整合查询操作-查询快照,表历史,data files Manifests 查询快照,时间戳数据...
  20. web安全相关知识点(持续更新中)

热门文章

  1. 调试Python代码
  2. xp计算机考试资源管理,职称计算机WindowsXP必备考点:资源管理器
  3. 码出高效:Java开发手册 ——百度网盘下载链接
  4. 基于边缘AI计算的人员入侵检测CNN算法在实际场景中的应用
  5. Adobe Acrobat 虚拟打印机安装方法(无法找到Adobe PDF资源文件)
  6. SVN 如何把一个项目的版本回退到指定版本
  7. 李雅普诺夫(第二方法)稳定性分析+例题
  8. 无线通信设备安装工程概预算编制_安装工程定额与预算编制——安装工程概预算培训...
  9. 安卓网络测试工具_专业网速测试工具高级版,支持5G网络测试网速
  10. PyTorch 实现 GradCAM