短链接生成实现

PHP实现百度、新浪的API接口调用生成短链接 长连接和短连接 长连接:是指在一个TCP连接上可以发送多个数据包,但是如果没有数据包发送时,也要双方发检测包以维持这个链连接 短连接:当双方需要有数据交互的时候,就建立一个TCP连接,本次交互完成后,就断开这个连接 WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成... 阅读详情
背景

最近偶然看到运营在群里进行页面分享的时候链接很长,导致发出来之后直接被刷屏,这样体验肯定不好,当然也不利于推广,因此比较好的方式是生成一个短链接服务,能够把链接变短,所以自己写个工具进行优化,也调研了下常见的短链接服务设计。

方案对比

方案1: 可以通过摘要MD5运算,得到一个固定长度的值,然后持久化到数据库。当然在生成的时候都需要判断是否重复,哈希碰撞的话,也就是如果重复就重新进行运算,直到生成并写入到数据库。
优点:长度固定、直接调用库简单。
缺点:数据量大的时候可能碰撞比较频繁,导致生成效率比较低,当然可以根据业务考虑进行定期短链接的清理。

方案2:可以用一张表的字段自增来实现长链接的映射,当然为了进一步精简还可以把10进制优化成62进制,也就是[0-9],[a-z][A-Z]62个字符,只用4位即可表达62^4个链接,所以非常够用了。至于高并发网上一般的方案是做成分布式,但是在我看来并不用这么复杂,可以参考分布式id生成方式,不用每次都去请求DB拿到自增值,可以在每台应用机器内缓存一个区间,这样大大降低DB的负载,唯一缺陷是因为机器重启内存断电导致的中间序列可能断,但是这对于业务来说不重要。在这里插入图片描述
核心逻辑代码实现:

public class ShortUrlGenerator {

    /**
     * 内存缓存的最大值
     */
    private int maxId = 0;

    /**
     * 步长,每次DB获取的长度
     */
    private int delta = 10;

    /**
     * 生成后DB的长短链接映射
     */
    private Map<String, String> dbMap = new HashMap<>();

    public static void main(String[] args) {
        ShortUrlGenerator shortUrlGenerator = new ShortUrlGenerator();
        for (int i = 0; i < 10000; i++) {
            String s = "http://longLinkDomain/" + i;
            String shortUrl = shortUrlGenerator.generate(s);
            System.out.println("生成短链接:" + shortUrl + ", 获取到原始链接为:" + shortUrlGenerator.get(shortUrl));
        }
    }

    // 301重定向长链接
    private String get(String shortUrl) {
        return dbMap.get(shortUrl);
    }

    private static final String DOMAIN = "http://micro/";
    private Table table = new Table();

    public String generate(String str) {
        if (maxId % delta == 0) {
            // 重启,或则内存的id区间消耗完了,请求DB获取区间
            maxId = table.auto();
        }
        int id = maxId --;
        // 0,9,  a,z  A,Z
        // 转换为62进制的4位短链接
        String s = parseInteger2Char(id, 62, (o) -> {
            if (o <= 9) return (char) ('0' + o);
            if (o >= 10 && o < 36) return (char) ('a' + (o - 10));
            return (char) ('A' + (o - 36));
        });
        String ret = DOMAIN + s;
        dbMap.put(ret, str);
        return ret;
    }

    /**
     * 
     * @param id 需要转换的id自增
     * @param hex  转换的进制,我这里是用62
     * @param mapperFunction  对应的进制需要用一个数字映射字符的逻辑,回调函数
     * @return
     */
    private String parseInteger2Char(Integer id, int hex, Function<Integer, Character> mapperFunction) {
        /*
        进制转换
         */
        Stack<Integer> stack = new Stack<>();
        while (true) {
            int n = id % hex;
            stack.push(n);
            id /= hex;
            if (id < hex) {
                stack.push(id);
                break;
            }
        }
        /*
        短链接字符映射
         */
        StringBuffer sb = new StringBuffer();
        while (! stack.isEmpty()) {
            sb.append(mapperFunction.apply(stack.pop()));
        }
        return sb.toString();
    }

}

/**
 * 模拟DB自增获取操作
 */
class Table {
    // 原子类,避免并发问题
    private AtomicInteger id = new AtomicInteger(0);
    
    // 此处统计DB请求次数
    int count = 0;
    public Integer auto() {
        count ++;
        System.out.println("DB请求次数 : " + count);
        return id.getAndAdd(1000);
    }
}
总结

网上还有一种是生成随机数,当然也会用哈希碰撞的问题,所以个人认为利用DB的自增算法相对复杂度和可靠性来说高一些, 其中批量缓存区间是一个好的思想,另一方面业务上的考虑也是很重要的,例如预期设计复杂的哈希碰撞解决方案可能从如何避免数据量增大导致碰撞概率更简单 。

微博短链接生成算法与简单实现 自从twitter推出短网址(shorturl),国内也有很多互联网公司推出短网址链接,比如微博等。 下面是从网上找到了一些算法总结: 算法一: 最容易想到的算法可能是利用md5类的加密算法,然后针对加密后的字符串进行处理。 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 阅读详情

相关推荐

生成短链接的PHP代码实现

通过将长链接转换为短链接,我们可以使得链接更加简洁、易于分享和记忆。通过使用数据库来存储长链接和对应的短链接代码,我们可以实现长链接到短链接的映射。希望这篇文章能帮助你理解如何在PHP中生成短链接,并在实际应用中使用它。在网络应用开发中,经常会遇到需要生成短链接的需求。短链接是一种将长网址转换为短网址的技术,使得长网址更加简洁、易于分享和记忆。首先,我们需要一个数据库来存储长链接和对应的短链接。函数接受一个长链接作为参数,生成短链接并将长链接和短链接代码插入到数据库表中。函数,并打印生成的短链接。

RielProgram的博客 636

短链是什么原理?怎么实现呢?

301其实是比较符合HTTP协议语义的,但浏览器会缓存目标网址,下次访问时会直接跳过短链,跳转到目标网址,无法做一些统计,比如短链访问次数等。常用的自增序列算法有雪花算法、Redis自增、MySQL主键自增等,生成唯一ID后,再转换为62进制字符串,转换后的62进制字符串可用作短链。原理还是很简单的,其实就是在后台保存有短链和长链的映射关系,然后进行重定向,让浏览器跳转到对应的长链接。302:浏览器访问时,会先后访问短链代理服务和目标服务,对服务器的压力也就相应大些,但可以做一些统计。

lingbomanbu_lyl的博客 9226

go语言实现短链接生成算法(附完整源码)

go语言实现短链接生成算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 383

短链原理与实现方案

发送邮件通知,嵌入链接跳转到系统后台页面,如果链接过长,消息体显示的时候会影响布局与美观,所以需要将原始的http长链接转为短链接显示,当点击短链接跳转时,采用301或302状态码的方式将短链重定向到长链。...

wcherish7的博客 2620

易语言实现新浪短链接的生成方法

易语言,一种简单易学的编程语言,专为中文用户设计,强调快速开发与中文编程体验。自2000年推出以来,易语言以其友好的界面和丰富的中文命令库吸引了广大编程爱好者和专业人士。它不仅支持可视化设计,还提供了强大的网络编程和数据库交互功能,使得开发者能够轻松地进行软件开发与创新。本章将深入探讨易语言的基础知识和使用优势,帮助读者快速上手,为进一步学习网络编程和短链接服务打下坚实的基础。新浪短链接服务是一种将长URL地址转换为短URL地址的在线服务。

weixin_42590539的博客 630

短链接生成系统源码与防红域名实现

为了生成 URL 安全且易于传播的短码,通常会采用Base62或自定义 Base64 字符集。Base62 只使用 62 个字符(大小写字母 + 数字),避免了和等特殊字符的出现,更适合在 URL 中直接使用。Base62 字符集示例:为了生成唯一的短码,通常需要将原始 URL 转换为一个唯一标识符(如数据库自增 ID、哈希值等),再使用自定义字符集进行映射。php// 自定义字符集(Base62)$code = '';

weixin_42601547的博客 924

短链接是怎么设计的?带你入门

说到 URL 你肯定不陌生,浏览器输入一段 URL,立马就跳转到你想要的网站,不过你应该也遇到过一些带了很多参数、特别长的 URL,看起来就乱糟糟的,能不能把它变短一点? 首先你要知道的是,长链是没法压缩成短链的,那我们这里怎么设计短链?

持之以恒 6300

Unity 开发Apple Vision Pro物体识别追踪ObjectTracking

当您在 visionOS 应用中实现对象跟踪时,您可以将现实世界中的物体无缝集成到人们的周围环境中,以增强他们的沉浸式体验。通过跟踪一个或多个物体的 3D 位置和方向,您的应用可以使用虚拟内容增强它们。您可以使用对象跟踪来提供与人周围环境中的对象的虚拟交互,例如:引导某人使用某件物品的功能、阅读其历史或了解其在周围环境中的行为。使用虚拟手册帮助人们解决家居用品和电器的问题。

Cool-浩 1185

短链原理是什么?怎么实现呢?

原创 活力满满Nick发表于广东知识赋能,共同成长,平时主要会分享两个板块的知识: 1、理财保险类:保险专业知识、金融政策、法律常识、职业成长规划、副业探索等。2、Java相关技术知识:高性能编程专题、中间件专题、分布式系统开发专题、微服务专题。36篇原创内容公众号一、为什么需要短链二、短链跳转访问原理三、短链生成实现方案1、自增序列算法2、Hash算法四、代码示例1、表结构及索引2、外部依赖4、DAO层5、业务层五、测试用例。

竹林幽深 1084

深入博通PEX89000内部:那颗ARM CPU和Synthetic Mode到底能玩出什么花样?

本文深入解析博通PEX89000系列PCIe交换芯片内置的ARM CPU与Synthetic Mode技术,揭示其在AI计算和数据中心的智能潜能。通过ARM Cortex CPU的实时控制和Synthetic Mode的自治网络功能,PEX89000实现了GPU集群的动态拓扑重组和资源池化,大幅提升AI训练效率。文章还探讨了该技术在软件定义数据平面和弹性AI架构中的创新应用。

weixin_30776273的博客 210

LS-Dyna模态分析实战:从模型构建到结果解读的全流程指南

本文提供了一份详尽的LS-Dyna模态分析实战指南。文章系统讲解了如何利用LS-Dyna内置的隐式求解器进行特征值求解,从模型构建、几何清理、材料与连接设置,到核心的边界条件与隐式求解控制(如*CONTROL_IMPLICIT_EIGENVALUE),最后完成计算并解读频率与振型结果。旨在帮助工程师在熟悉的环境中高效完成结构振动特性分析,为后续动态响应分析奠定基础。

info6的博客 262

探究短信里的短链接是如何实现的

我们日常在收短信的时候,会经常发现,他们的短信里的跳转链接,都是非常短非常短的,这是为什么呢?因为现在短信新规出来,是按字数收费的,而不是按条。比如腾讯云短信新规,70字为一条,哪怕你是一条短信,100个字,就会按照两条来计费,这个时候短链接就有了相当大的优势。那么短链接是如何实现的呢?

热爱技术,享受生活 2060

MetaGPT核心模块:Data Interpreter 上手实战 - 数据分析和可视化(附运行过程详解)

上篇文章我们详细解读了 DataInterpreter 的实现原理(论文),本文将开始上手实操,开始写代码用上 DataInterpreter。从最简单的例子开始,先给大家看下其运行过程,看下DataInterpreter是如何自动拆解任务,完成任务的,帮助大家构建直观认识。

同学小张的博客 371

Java实现短链接URL生成

现在比较流行短连接,例如新浪微博,腾讯等等公司都开始使用短连接。 ① 将长网址用md5算法生成32位签名串,分为4段,,每段8个字符; ② 对这4段循环处理,取每段的8个字符, 将他看成16进制字符串与0x3fffffff(30位1)的位与操作,超过30位的忽略处理; ③ 将每段得到的这30位又分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串; ④ 这样一个md5字符串可以获得4个6位串,取里面的任意一个就可作为这个长url的短url地址。 很简单的理论,我们并不一定说得

z69183787的专栏 9447

203.华为组网实例:VLAN间互通DHCP中继实验

SW核心交换机上配置DHCP中继。

迷逝 8432

点云最小二乘法拟合曲线

文章目录一、引言 一、引言

dayuhaitang1的博客 2734

java 实现 生成短链接服务

短链接生成的java常用实现

zhangsir的博客 1万+

VMware Horizon 8 2111 部署系列(九)创建即时克隆桌面池

即时克隆桌面池是在 vCenter Server 中使用 vmFork 技术(称为即时克隆 API)从最佳配置映像创建的自动桌面池。即时克隆共享同一个基础映像虚拟机,使用基础映像虚拟机的快照创建的,它使用的存储空间也少于完整虚拟机。 即时克隆始终保持开机状态,并在注销后从当前发布的映像重新创建。...

白昼的技术专栏 4042

Java实现短链接生成

可以使用redis的hash,当然也可以使用redis的key-value去实现,使用redis的hash结构呢,能将相同业务的短链接放到一个Key里面去管理.c4xV4F),后面一般是6为字符串,并不强制只是6位,可以自定义.可以开一个用于解密的接口,将Redis中的缓存的真实的URL返回.”)映射成短的url(

码码哈哈的博客 2950

【一看就会】autoware universe项目结构解析——从一层一层直到control源码

下载安装autoware universe花了一天。下载好之后,按照网上说的跑了一下仿真是能跑的,证明下的代码没问题。然后就得看一下各模块实现的源码了。但是当我打开这些文件的时候。我勒个豆。这么多是个玩意儿。我连该启动哪个launch文件,哪个文件夹是干啥的都不知道。在我慢慢弄懂之后,我也记录这个庞大的项目的各个文件夹和里面的文件以及项目,以及自己使用时应该启动哪些launch文件。这篇文章目的就是通过找到control部分的源码,来帮助我们梳理这个庞大项目的各个文件的功能。

weixin_48386130的博客 2037

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JAVA实现生成短链接

JAVA实现生成短链接

州仔 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

php 长连接短链接,PHP实现URL长连接生成短链接操作

短链接,通俗来说,就是将长的URL 网址,通过程序计算等方式,转换为简短的网址字符串。这样的话其好处为:1、内容需要;2、用户友好;3、便于管理。早期短链接广泛应用于图片上传网站,通过缩短网址URL链接字数,达到减少代码字符串的目的。更便于使用者引用网址,写入代码中,“节省”字符数空间。常见于网店图片分类的使用,因有字符限制,运用短链接,达到外链图片的目的。自微博盛行以来,在微博字数有限的特色下,...

weixin_39665762的博客 366

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

golang如何实现短链接生成服务_golang短链接生成服务实现实践

短链接生成的核心逻辑是随机映射+数据库去重校验。跳转走302,路由通配,DB建唯一索引,开发用SQLite+Redis,压测P99<5ms。,重复则重试(建议上限 3 次,超时就报错)别用 uuid.NewString() —— 太长,且带连字符,不适合做路径段如果并发高,单靠应用层重试容易雪崩,可配合 Redis 的 SETNX 做原子预占(SETNX short:abc123 "pending")数据库设计要支持快速跳转和防刷跳转性能取决于能否单次索引查询完成,所以 short 字段必须建唯一索引;

2301_80353895的博客 306
上一篇: 力扣今日打卡之数组的全排列
下一篇: 字节跳动算法题跳跃游戏
micro_hz
博客等级 码龄11年 429粉丝 292原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值