短链接业务解决方案(附源码项目)

news2024/11/20 6:21:37

开源地址

https://github.com/lcy19930619/short-link
一个单节点短链接项目,有需要的拿去改改就行了,如果方便,可以帮忙点点star

什么是短链接

在这里插入图片描述
蓝色部分就是短链接

为什么要用短链接?

因为短信是按照字符去计算条数的,超过70字符就是两条短信,一条短信一毛钱,如果你用的链接比较长,嘿嘿,成本偏高

如何理解短链接的业务流程?

  • 首先,你要有一个待跳转的长链接地址,这个链接长度随你心情,多长都行,参数也是看你安排,可以携带用户唯一标识,比如,加密后的用户id
  • 使用雪花id,生成一个全局唯一的id
  • 使用签名算法,生成一个唯一的短key,长度短一些就行
  • 把这几个数据信息,存储到一张表中
  • 使用短key,和你的短链接跳转域名,拼接成一个短链接
  • 将这个短链接,发送给用户
  • 用户点击短链接,产生get请求,后端服务器拿到这个链接的key,去查询数据库,从而获得长链接地址
  • 利用重定向技术,实现从短链接向长链接跳转

301 302 如何选择

  • 如果你的业务需要跟踪用户点击,并且需要记录用户的多次点击情况,那么别犹豫,直接用301
  • 如果你仅仅只需要一个重定向,那就302,准没错

注:301、302 仅适用于 get 请求,post 请求需要使用307,在url重定向的过程中,只有 get 请求,301为临时重定向,多次点击依然会访问后端,302为永久重定向,同一个设备的同一个浏览器,仅访问一次后端

遇到的问题

雪花id存在的时钟回拨问题

服务器一般都会配置时间同步服务,但是这个同步时间时候,有个几毫秒的误差,如果并发量不大的情况下,还好,一但并发过高,就可能会导致出现重复的雪花id

数据存储过大问题

短链接数据量可能会很大,比如一次推送的用户比较多,而连接要存储很久,所以存储空间就会比较大

链接的可控性

一旦手抖,写了一个有问题的链接,要能对这一批链接进行处理,比如,重定向到404什么的,及时止血

数据记录

有很多业务需求,需要记录点击次数等要求,因此需要有新的记录表记录数据的点击时间

链接的安全性认证

每当用户点击此链接时,需要验证该短链接是否为当前用户专属,否则会泄露用户隐私

问题解决方案

问题一:雪花id时钟回拨问题

采用超卖思想,提前预支雪花id,单节点模式下,利用定时线程,将生成的雪花id存储到一个 Set 集合中,而后达到一定数量,存储到阻塞队列中,从而解决这个时钟回拨产生重复id问题
示例代码如下:

package net.jlxxw.link.component;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.annotation.PostConstruct;
import net.jlxxw.link.util.SnowflakeIdWorker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

/**
 * 队列id 生成器,解决雪花id存在的时钟回拨问题
 * @author chunyang.leng
 * @date 2022-11-28 1:12 PM
 */
@Primary
@Component
public class QueueIdCenter implements IdCenter {
    private static final Logger logger = LoggerFactory.getLogger(QueueIdCenter.class);
    /**
     * 长度 20w 的 雪花id
     */
    private static final BlockingQueue<Long> QUEUE = new LinkedBlockingQueue<>(200000);

    @Autowired
    private  SnowflakeIdWorker snowflakeIdWorker;

    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;


    @PostConstruct
    private void init(){
        threadPoolTaskExecutor.execute(()->{
            while (true) {
                try {
                    initQueue();
                }catch ( Exception e ){
                    logger.error("队列id生成器出现未知异常",e);
                }finally {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ignored) {

                    }
                }
            }
        });

    }



    /**
     * 获取id
     *
     * @return
     */
    @Override
    public Long getId() {
        try {
            return QUEUE.take();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


    private void initQueue(){
        int size = 100000;
        if (QUEUE.size() < size){
            logger.info("初始化队列开始");
            Set<Long> set = new HashSet<>(size);
            while (set.size() < size){
                try {
                    long id = snowflakeIdWorker.nextId();
                    set.add(id);
                }catch (Exception ignored) {

                }
            }
            QUEUE.addAll(set);
            logger.info("初始化队列结束");
        }
    }
}

问题二:存储

短链接表中存储了雪花id字段值,必要时刻可以根据此字段进行分库分表,降低MySQL存储压力,也可以使用mongodb进行存储,同为b tree存储,mongo压缩性能比MySQL能好一些

问题三:止血

链接存储时增加一个字段,标识数据是否启用

问题四:数据记录

新建数据表,存储多条记录即可

问题五:隐私

生成短链接时,就要存储用户id,在重定向时,将短链接参数添加到url参数中,业务接口通过Http header中的 referer,获取短链接key,去查询并判断是否和当前用户相同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12月21日 OpenCV 实战基础学习笔记——背景建模、光流估计

文章目录前言一、背景建模1、帧差法2、混合高斯模型二、光流估计前言 本文为12月21日 OpenCV 实战基础学习笔记&#xff0c;分为两个章节&#xff1a; 背景建模&#xff1b;光流估计。 一、背景建模 1、帧差法 由于场景中的目标在运动&#xff0c;目标的影像在不同图像帧中…

Redis哨兵机制以及发布订阅

Redis哨兵机制1 哨兵Sentinel机制2 哨兵架构原理3 搭建哨兵架构4 通过springboot操作哨兵Redis发布订阅1 哨兵Sentinel机制 Sentinel&#xff08;哨兵&#xff09;是Redis 的高可用性解决方案&#xff1a;由一个或多个Sentinel 实例组成的Sentinel 系统可以监视任意多个主服务…

海格里斯HEGERLS深度解析|重型四向穿梭车的轨道换向组件及轨道系统

随着自动化仓储物流系统的广泛应用&#xff0c;物流设备也更趋于多样化&#xff0c;比如在货架轨道上可四向行走的穿梭车应运而生&#xff0c;重型四向穿梭车作为一种新型的物流存储设备&#xff0c;通常在轨道平面上有行走方向相互垂直的两个行走系统&#xff0c;通过两个行走…

gRPC学习Go版(一)

文章目录微服务入门gRPC是什么proto 服务定义gRPC 优势gRPC入门简单使用一元RPC服务流RPC客户流RPC双工流RPCgRPC底层原理RPC流长度前缀的消息分帧请求消息响应信息通信模式下的消息流微服务入门 现在的软件很少是一个孤立的单体应用运行的&#xff0c;相反更多是通过互联网连接…

玩以太坊链上项目的必备技能(错误处理以及异常-Solidity之旅十四)

错误处理 作为开发者的我们知道&#xff0c;我们所编写出来的程序难免会出现 bug &#xff0c;而要做的是捕获异常&#xff0c;给用户抛出一个友好地错误提示。 而在 Solidity 中&#xff0c;根据状态恢复异常来处理错误&#xff0c;该异常将撤销在当前调用中对状态所做的所有…

[思维模式-9]:《如何系统思考》-5- 认识篇 - 改变开环、组合逻辑的线性思考,实施闭环、时序逻辑的动态思考。

目录 第1章 因果关系 1.1 因果关系 1.2 因果关系的特点 1.3 因果关系的类型 第2章 线性思考遇到的问题&#xff1a;开环思维、组合逻辑 2.1 开环系统 2.2 组合逻辑 2.3 线性关系 2.4 什么是线性思维&#xff1a;线性因果关系 2.5 线性思维的数学本质 2.6 线性思维的…

自动化药房出药升降机选型设计

一、 运动规划、运动参数的确定 1、 运动参数计算 运动参数主要通过速度规划确定&#xff0c;速度规划采用直线速度特性&#xff0c;如图所示。 运动方程为&#xff1a; 2、 X方向的速度和加速度的估算 已知参数&#xff1a; X方向行程:1…

stream_component_open函数分析

stream_component_open() 函数主要作用是打开 音频流或者视频流 对应的解码器&#xff0c;开启解码线程去解码。 流程图如下&#xff1a; stream_component_open() 的函数定义如下&#xff1a; /* open a given stream. Return 0 if OK */ static int stream_component_open(…

K8S知识点及dashboard操作

1.什么是K8S&#xff1f; K8S是一组服务器集群&#xff0c;可以在集群的各个节点上运行特定的容器。 K8S所管理的是&#xff1a;集群节点上的容器 特性&#xff1a; 自我修复&#xff0c;弹性伸缩&#xff08;根据实时服务器的并打情况&#xff0c;增加或收缩容器数量&…

网络编程套接字Socket(通过两个用例,逐行注释,详细理解)干活满满建议收藏

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1.分类1.流套接字2.数据报套接字3.原始套接字2.Socket通信模型 3.UDP套接字编程1. DatagramSocket API1.构造方法1.DatagramSocket()2.DatagramSocket(int port)…

C语言之复合类型上卷(十八)(阴阳两极)

上一篇: C语言之内存管理&#xff08;十七&#xff09;&#xff08;转世灵童现世&#xff09; 逐梦编程&#xff0c;让中华屹立世界之巅。 简单的事情重复做,重复的事情用心做,用心的事情坚持做&#xff1b; 文章目录前言一、什么是结构体&#xff1f;二、结构体的定义及初始化…

USB TO SPI(上海同旺电子)调试器调试MCP3201 A/D 转换器

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、MCP3201 12 位A/D 转换器; 特性 • 12 位分辨率 • 1 LSB DNL &#xff08;最大值&#xff09; • 1 LSB INL &#xff08;最大值&#xff09;&#xff08;MCP3201-B&#xff09; • 2 LSB INL &#xff…

pdf文件太大怎么变小,如何压缩pdf大小

pdf文件太大怎么变小&#xff1f;如果你是Windows电脑&#xff0c;可以使用PDF编辑器来减小PDF文件的大小&#xff0c;比如这款出色的PDF压缩工具-易我PDF编辑器&#xff0c;它的“压缩”功能提供了两种减小文件大小的方法&#xff0c;这使得它既适合那些只想获得更小的PDF的人…

【vscode】c++程序的自动编译及调试(环境centos)

目录1.新增配置文件&#xff08;1&#xff09;c_cpp_properties.json&#xff08;2&#xff09;files.associations&#xff08;3&#xff09;tasks.json(4)CMakeLists.txt2.断点调试1.新增配置文件 VS Code的配置文件一般是指特定目录下的JSON文件。所谓JSON是一种文本格式&a…

LCF-ATEPC(2020 Elsevier)面向中文的方面级提取和分类

论文题目&#xff08;Title&#xff09;&#xff1a;A Multi-task Learning Model for Chinese-oriented Aspect Polarity Classification and Aspect Term Extraction &#xff08;面向中文的方面极性分类和方面项提取的多任务学习模型) 研究问题&#xff08;Question&#…

适用于 Windows 10/11 电脑 的 5 大好用的离线录屏软件

屏幕录制应用程序可以数字记录出现在任何设备或 PC 屏幕上的内容&#xff0c;并同时以高清流式传输音频和视频。 因此&#xff0c;他们帮助创建营销视频、跟踪客户行为、设计产品演示、监控员工活动、录制教育内容、网络研讨会内容和业务会议内容。 现在您已经意识到屏幕录…

VS系列多通道振弦传感器无线采发仪的数据发送说明

每次设备启动后会将采集到的传感器数据进行内部存储&#xff0c;并在设置好的时间间隔将数据发送出去&#xff0c;通过修改“数据发送方式”参数&#xff0c;监测数据可由数据接口输出也可经由无线网络发送。在发送监测数据时&#xff0c;可通过修改“数据包协议”参数来设置所…

函数和数组习题

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C语言基础习题】 文章目录知识点习题2.实现一个整型数组的冒泡排序&#xff08;编程体&#xff09;。3.编程题&#xff1a;创建一个整型…

springcloud,springboot各个版本之间的关系

1 版本关系 在实际的开发中如果要自己搭建矿建&#xff0c;发现springcloud&#xff0c;springboot的版本可能是首先需要确定的&#xff0c;那么他们之间的关系是什么呢&#xff1f;看官网&#xff0c;地址 Spring Cloud 左侧是cloud的版本&#xff0c;右侧是对应的文档&…

Splunk Window 客户端迁移

最近客户的Splunk deployment server 要迁移,伴随着client 端的配置也要相应的调整: 先看一下架构: 看一下主要的参数: Summary of key terminology Heres a recap of the key definitions: TermMeaningdeployment serverA Splunk Enterprise instance that acts as a c…