专业的短链接生成工具
链接域名
短网址有效期
手机短信收到的短链接如何生成?
更新时间:2025-5-1 16:53:12 作者:爱短链
想必大家都经常收到垃圾短信……短信中的链接一般都是短链接:
为什么网址这么短?有什么好处?短链接如何生成的?
短网址的好处是:
短。短信和很多平台(微博)都有字数限制,不能加长链接。
好看。与很多未知参数相比,短链接更加简洁友好。
做一些统计很方便。当你点击链接时,会有人记录和分析。
安全。不公开访问参数。
这就是为什么我们现在收到的大多数垃圾邮件都是短 URL。
那么短链接如何生成的呢?
短网址从生成到使用分为以下几个步骤。
有一项服务可以将要发送给您的长 URL 映射到短 URL。例如 ->
将短url拼接到短信内容等中发送。
用户点击短网址,浏览器通过301/302重定向访问对应的长网址。
显示相应的内容。
本文主要关注第一步,即如何将长网址映射到短网址。
如果你考虑一下长URL和短URL之间的真正对应关系,那么你会走得很远。
理想的情况是:我们使用一种算法将每个长 URL 唯一地转换为一个短 URL。它还保持了反向转换的能力。
但这是不可能的,如果有这样的算法,世界上所有的压缩算法都可以死在原地。
正确的思路是建立一个sender,每次有新的长URL进来,我们就加一,返回新的值。第一个 URL 返回“/0”,第二个 URL 返回“/0” 返回“/1”。
接下来,以QA形式写几个小问题:
这个对应的数据必须放在磁盘上,而且每次系统重启都不能重新排列编号,所以可以存储在mysql等数据库中。而如果数据量小,qps低,可以直接使用数据库的自增主键。意识到。
根据上述发行方策略,无法保证长短链接一一对应。如果连续两次使用同一个URL,结果值会不同。
为了实现长短链接一一对应,需要付出很大的空间成本,尤其是为了快速响应,可能需要在内存中做一层缓存,太浪费了.
但是可以实现一些变体来实现部分的一一对应超值资料:手机短信中的短链接是如何设计和实现的?,比如将最新/最流行的对应存储在K-V数据库中,这样可以节省空间,加快响应速度。
我们返回的短网址一般是把数字转换成32进制,这样可以更有效的缩短URL长度,那么32进制的数字对于电脑来说只是一个字符串,怎么存储呢?直接存储字符串 很容易找到等值,但是对范围搜索太不友好了。
其实可以直接存储十进制数,不仅占用空间更小,对搜索的支持也更好,同时可以更方便的转换成more/less bases,进一步缩短网址。
如果直接存储在MySQL中,当并发请求增加时,对数据库的压力太大,可能会造成瓶颈。这时候可以做一些优化。
缓存
在长链接和短链接的一一对应中也提到了缓存。这里我们要加快程序的处理速度。流行的长链接(需要统计长链接进来的次数),最近的长链接(可以用redis保存最后一小时)等等缓存,保存在内存或者redis中- 类似内存数据库,如果请求的长URL命中缓存,则直接获取对应的短URL并返回,无需再次生成操作。
分批发号
每次下发一个数字,都需要访问MySQL一次,获取当前最大数字,获取后更新最大数字,压力比较大。
我们每次可以从数据库中获取10000个数字,然后在内存中发出。当剩余数字小于 1000 时,我们将重新向 MySQL 请求 10000 个数字。上一批号发出后,分批写入回车。
这样可以将数据库的持续操作移到代码中,异步进行取写操作,保证服务的持续高并发。
上面设计的系统是单点的,即发射机是单点的,很容易挂机。
可以使用分布式服务。如果是分布式的话,如果每个发行者在发号后都需要同步到其他发行者短信短链接,可能不会太麻烦。
换一种思路,可以有两个数字发送器,一个用于单号,一个用于双号。号码发出后,不再加1,而是加12.
以此类推,我们可以用1000个服务发出0-999结尾的号码,每个号码发出后递增1000.这个很简单,服务之间基本不需要通信, 做你自己的事。
因为我懒得写JDBC代码,更懒得去弄Mybatis,所以代码里凡是用到MySQL的地方我都用Redis。
package util; import redis.clients.jedis.Jedis; /** * Created by pfliu on 2019/06/23. */ 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)); } } }
短链接如何生成?搞定,短链接就是这么生成的,你学会了吗?
以上就是关于《手机短信收到的短链接如何生成?》的全部内容了,感兴趣的话可以点击右侧直接使用哦!》》在线短链接生成器