java面试场景题:QPS 短链系统怎么设计
以下是对文章的润色版本:
这道场景设计题,初看似乎业务简单,实则覆盖的知识点极为丰富:
- 高并发与高性能分布式 ID 生成机制;
- Redis Bloom Filter——高并发、低内存损耗的过滤组件知识;
- 分库、分表海量数据存储架构;
- 多级缓存策略;
- HTTP 传输原理;
- 二进制、十六进制、六十二进制知识。
总体而言,高并发、高性能系统的核心领域几乎都涵盖其中。经过深入分析,可以得出结论:这是一个极具价值的问题。
在互联网传播和引用中,短网址常被用来替代长 URL。例如 QQ 微博的 url.cn、新浪的 sinaurl.cn 等。在 QQ、微博等平台上发布网址时,系统会自动识别并将其转换为短网址,如 url.cn/2hytQx。这种做法的原因主要有以下几点:
- 缩短地址长度,为有意义内容留出更多空间:原始 URL 往往较长,占用大量有效屏幕空间,尤其是对于微博这类字数受限的平台(如微博单条限制 140 字),过长的链接会占据内容篇幅的一半甚至更多,严重影响信息展示。短网址的出现,使得在有长度限制的平台上发布内容时,可编辑的文字数量得以增加。
- 有效管控原始 URL 内容:部分网址可能包含不良信息,如暴力、广告等。通过用户的举报,我们可以对这些 URL 进行管理,使其不再出现在应用中。因为相同的 URL 经过加密算法处理后,得到的短网址是相同的,便于统一管控。
- 便于对原始 URL 进行行为分析:通过对一系列网址的流量、点击等数据进行统计分析,可以挖掘出大多数用户关注的焦点,从而为项目的后续决策提供有力支持。
此外,短网址还具有以下优势:
4. 间接提高带宽利用率,节约成本;
5. 在某些平台上,过长的链接无法自动识别为超链接;
6. 短链接更加简洁、美观且安全,不暴露访问参数,还能规避关键词、域名屏蔽等手段。
短 URL 系统的核心在于将长 URL 转化为短 URL。客户端访问系统时,短 URL 的工作流程如下:
- 客户端使用短地址 A 访问短链 Java 服务;
- 短链 Java 服务进行地址转换和映射,将短 URL 映射到对应的长地址 URL;
- 短链 Java 服务返回 302 重定向给客户端;
- 客户端再重定向到原始服务。
那么,原始 URL 是如何变短的呢?简单来说,可以使用编号替代原始地址,而编号可以通过使用更大的进制来表示,从而进一步缩短长度。
1. 短 URL 系统的背景
2. 短 URL 系统的原理
六十二进制表示法:顾名思义,短网址是非常短的网址,如 xxx.cn/EYyCO9T,其中核心部分 EYyCO9T 只有 7 位长度。这 7 位长度是使用 62 进制表示的,即常用的 0-9、a-z、A-Z,共 10 个数字 + 26 个小写 + 26 个大写 = 62 位。
那么,7 位长度的 62 进制可以表示多大的范围呢?短网址的长度可以根据需要调整,如果需要更多范围,可以增加位数。即使 6 位长度的 62^6 也能达到 568 亿的范围。只要算法得当,可以覆盖很大的数据范围。
在编码过程中,可以根据需求调整 62 进制各位的含义。例如,在编码过程中,如果不想让人明确知道转换前的内容,可以进行弱加密。
- 62^7 = 3,521,614,606,208(合计 3.5 万亿)
- 10 进制最多只能生成 10^6 - 1 = 999,999 个
- 16 进制最多只能生成 16^6 - 1 = 16,777,215 个
- 16 进制中已经包含了 A、B、C、D、E、F 这几个字母
- 62 进制最多能生成 62^6 - 1 = 568,002,355,833 个,基本足够使用
A-Z、a-z、0-9 正好等于 62 位。
注意:
- int(4 个字节),存储范围是 -21 亿到 21 亿;
- long(8 个字节),存储范围是 -900 万万亿到 900 万万亿。
例如,A 站点将字母 c 表示为 32,B 站点将字母 c 表示为 60,这就相当于一种“密码本”。标准 ASCII 码也叫基础 ASCII 码,使用 7 位二进制数(剩下的 1 位二进制为 0),包含 128 个字符。看到这里,你或许会问,如果使用 128 进制(如果有的话),网址岂不是更短?确实如此。
7 位二进制数(剩下的 1 位二进制为 0)可以表示所有的大写和小写字母、数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。假设短地址长度为 8 位,62 的 8 次方足够一般系统使用。
3. 短 URL 系统的功能分析
系统核心实现包含三大功能模块:发号与存储模块、映射模块。
发号与存储模块:
- 发号:使用发号器为每个长地址分配一个号码 ID,并防止地址歧义,即防止同一个长地址多次请求得到的短地址不一样。
- 存储:将号码与长地址存放在数据库中,将号码转化为 62 进制,用于表示最终的短地址,并返回给用户。
映射模块:
- 用户使用 62 进制的短地址请求服务。
- 转换:将 62 进制的数转化为 10 进制,因为系统内部使用的是 long 类型的 10 进制数字 ID。
- 映射:在数据库中寻找对应的长地址。
- 通过 302 重定向,将用户请求重定向到对应的地址上。
回顾一下发号器的功能:为每个长地址分配一个号码 ID,并防止地址歧义。
以下是对目前流行的分布式 ID 方案的简单介绍:
方案 1:使用地址的 hash 编码作为 ID
- MD5 算法:MD5 消息摘要算法(MD5 Message-Digest Algorithm)是一种被广泛应用的密码散列函数,可以产生一个 128 位(16 字节)的散列值(hash value)。MD5 算法将数据(如一段文字)运算变为另一个固定长度值,这是散列算法的基础原理。该算法由美国密码学家 Ronald Linn Rivest 设计,于 1992 年公开,并在 RFC 1321 中被加以规范。
- CRC 算法:循环冗余校验(Cyclic Redundancy Check)是一种根据网络数据包或电脑文件等数据,产生简短固定位数校验码的散列函数,由 W. Wesley Peterson 于 1961 年发表。生成的数字在传输或存储之前计算出来并附加到数据后面,然后接收方进行检验以确定数据是否发生变化。由于该函数易于用二进制的电脑硬件使用、容易进行数学分析,并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。
- MurmurHash:MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。由 Austin Appleby 于 2008 年发明,并出现了多个变种。与其他流行的哈希函数相比,对于规律性较强的键,MurmurHash 的随机分布特征表现更良好。该算法已被许多开源项目使用,如 libstdc++(4.6 版)、Perl、nginx(不早于 1.0.1 版)、Rubinius、libmemcached、maatkit、Hadoop、Redis、Memcached、Cassandra、HBase、Lucene 等。MurmurHash 计算可以是 128 位、64 位、32 位,位数越多,碰撞概率越少。因此,可以对长链进行 MurmurHash 计算,得到一个整数哈希
相关文章:
java面试场景题:QPS 短链系统怎么设计
以下是对文章的润色版本: 这道场景设计题,初看似乎业务简单,实则覆盖的知识点极为丰富: 高并发与高性能分布式 ID 生成机制;Redis Bloom Filter——高并发、低内存损耗的过滤组件知识;分库、分表海量数据存…...
java面试场景提题:
以下是润色后的文章,结构更清晰,语言更流畅,同时保留了技术细节: 应对百倍QPS增长的系统设计策略 整体架构设计思路 面对突发性百倍QPS增长,系统设计需从硬件、架构、代码、数据四个维度协同优化: 硬件层…...

K7 系列各种PCIE IP核的对比
上面三个IP 有什么区别,什么时候用呢? 7 series Integrated Block for PCIE AXI Memory Mapped to PCI Express DMA subsystem for PCI Express 特点 这是 Kintex-7 内置的 硬核 PCIe 模块。部分事务层也集成在里面,使用标准的PCIE 基本没…...

natapp 内网穿透失败
连不上网络错误调试排查详解 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 如何将DNS服务器修改为114.114.114.114_百度知道 连不上/错误信息等问题解决汇总 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 nslookup auth.natapp.cnping auth.natapp.cn...

深入解析CI/CD开发流程
引言:主播最近实习的时候发现部门里面使用的是CI/CD这样的集成开发部署,但是自己不是太了解什么意思,所以就自己查了一下ci/cd相关的资料,整理分享了一下 一、CI/CD CI/CD是持续集成和持续交付部署的缩写,旨在简化并…...

Docke启动Ktransformers部署Qwen3MOE模型实战与性能测试
docker运行Ktransformers部署Qwen3MOE模型实战及 性能测试 最开始拉取ktransformers:v0.3.1-AVX512版本,发现无论如何都启动不了大模型,后来发现是cpu不支持avx512指令集。 由于本地cpu不支持amx指令集,因此下载avx2版本镜像: …...

应用分享 | 精准生成和时序控制!AWG在确定性三量子比特纠缠光子源中的应用
在量子技术飞速发展的今天,实现高效稳定的量子态操控是推动量子计算、量子通信等领域迈向实用化的关键。任意波形发生器(AWG)作为精准信号控制的核心设备,在量子实验中发挥着不可或缺的作用。丹麦哥本哈根大学的研究团队基于单个量…...

相机--相机标定实操
教程 camera_calibration移动画面示例 usb_cam使用介绍和下载 标定流程 单目相机标定 我使用的是USB相机,所以直接使用ros的usb_cam功能包驱动相机闭关获取实时图像,然后用ros的camera_calibration标定相机。 1,下载usb_cam和camera_calibration: …...
深入理解汇编语言中的顺序与分支结构
本文将结合Visual Studio环境配置、顺序结构编程和分支结构实现,全面解析汇编语言中的核心编程概念。通过实际案例演示无符号/有符号数处理、分段函数实现和逻辑表达式短路计算等关键技术。 一、汇编环境配置回顾(Win32MASM) 在Visual Studi…...

DAY43 复习日
浙大疏锦行-CSDN博客 kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:把项目拆分成多个文件 src/config.py: 用于存放项目配置,例如文件路径、学习率、批次大小等。 # src/config.py# Paths DATA_DIR "data…...
【仿生机器人】仿生机器人智能架构:从感知到个性的完整设计
仿生机器人智能架构:从感知到个性的完整设计 仿生机器人不仅需要模拟人类的外表,更需要具备类人的认知、情感和个性特征。本研究提出了一个综合性的软件架构,实现了从环境感知到情感生成、从实时交互到人格塑造的完整智能系统。该架构突破了…...
【业务框架】3C-相机-Cinemachine
概述 插件,做相机需求,等于相机老师傅多年经验总结的工具 Feature Transform:略Control Camera:控制相机参数Noise:增加随机性Blend:CameraBrain的混合列表指定一个虚拟相机到另一个相机的过渡ÿ…...

【Auto.js例程】华为备忘录导出到其他手机
目录 问题描述方法步骤1.安装下载Visual Studio Code2.安装扩展3.找到Auto.js插件,并安装插件4.启动服务器5.连接手机6.撰写脚本并运行7.本文实现功能的代码8.启动手机上的换机软件 问题描述 问题背景:华为手机换成一加手机,华为备忘录无法批…...

单片机的低功耗模式
什么是低功耗? STM32的低功耗(low power mode)特性是其嵌入式处理器系列的一个重要优势,特别适用于需要长时间运行且功耗敏感的应用场景,如便携式设备、物联网设备、智能家居系统等。 在很多应用场合中都对电子设备的…...

架构师级考验!飞算 JavaAI 炫技赛:AI 辅助编程解决老项目难题
当十年前 Hibernate 框架的 N1 查询隐患在深夜持续困扰排查,当 SpringMVC 控制器中错综复杂的业务逻辑在跨语言迁移时令人抓狂,企业数字化进程中的百万行老系统,已然成为暗藏危机的 “技术债冰山”。而此刻,飞算科技全新发布的 Ja…...

手机端抓包大麦网抢票协议:实现自动抢票与支付
🚀 手机端抓包大麦网抢票协议:实现自动抢票与支付 🚀 🔥 你是否还在为抢不到热门演出票而烦恼?本文将教你如何通过抓包技术获取大麦网抢票协议,并编写脚本实现自动化抢票与支付!🔥 …...
使用阿里云百炼embeddings+langchain+Milvus实现简单RAG
使用阿里云百炼embeddingslangchainMilvus实现简单RAG 注意测试时,替换其中的key、文档等 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Milvus from langchain_text_splitters impor…...
C#合并CAN ASC文件:实现与优化
C#合并CAN ASC文件:实现与优化 在汽车电子和工业控制领域,CAN(Controller Area Network)总线是一种广泛使用的通信协议。CAN ASC(American Standard Code)文件则是记录CAN总线通信数据的标准格式ÿ…...

[TIP] Ubuntu 22.04 配置多个版本的 GCC 环境
问题背景 在 Ubuntu 22.04 中安装 VMware 虚拟机时,提示缺少 VMMON 和 VMNET 模块 编译这两个模块需要 GCC 的版本大于 12.3.0,而 Ubuntu 22.04 自带的 GCC 版本为 11.4.0 因此需要安装对应的 GCC 版本,但为了不影响其他程序,需…...

如何思考?分析篇
现代人每天刷 100 条信息,却难静下心读 10 页书。 前言: 我一直把思考当作一件生活中和工作中最为重要的事情。但是我发现当我想写一篇跟思考有关的文章时,却难以下手。因为思考是一件非常复杂的事情,用文字描述十分的困难。 读书…...

Redis:Hash数据类型
🌈 个人主页:Zfox_ 🔥 系列专栏:Redis 🔥 Hash哈希 🐳 ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在Redis中&#…...
抗辐照MCU在卫星载荷电机控制器中的实践探索
摘要:在航天领域,卫星系统的可靠运行对电子元件的抗辐照性能提出了严苛要求。微控制单元(MCU)作为卫星载荷电机控制器的核心部件,其稳定性与可靠性直接关系到卫星任务的成败。本文聚焦抗辐照MCU在卫星载荷电机控制器中的应用实践&…...

快捷键的记录
下面对应的ATL数字 ATL4 显示编译输出 CTRL B 编译 CTRLR 运行exe 菜单栏 ALTF ALTE ALTB ALTD ALTH...

Python读取阿里法拍网的html+解决登录cookie
效果图 import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from lxml import etreedef get_taobao_auct…...

electron-vite串口通信
一、构建项目后,安装“串口通信库” npm install serialport二、设置 npm install --save-dev electron-rebuild ./node_modules/.bin/electron-rebuild 注意:如果执行报错以下问题 1、未配置python变量 2、没有Microsoft Visual Studio BuildTools 3…...

中山大学美团港科大提出首个音频驱动多人对话视频生成MultiTalk,输入一个音频和提示,即可生成对应唇部、音频交互视频。
由中山大学、美团、香港科技大学联合提出的MultiTalk是一个用于音频驱动的多人对话视频生成的新框架。给定一个多流音频输入和一个提示,MultiTalk 会生成一个包含提示所对应的交互的视频,其唇部动作与音频保持一致。 相关链接 论文:https://a…...
Maven的配置与运行
maven配置国内镜像 <!-- # %MAVEN_HOME%\conf\settings.xml # 找到 <mirrors> 标签,添加: --> <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>htt…...
MySQL 迁移至 Docker ,删除本地 mysql
macOS 的删除有大量的配置文件和相关数据文件要删除,如果 update mysql 那么数据更杂。 停止 MYSQL 使用 brew 安装,则 brew services stop mysql 停止 mysql 。 如果没有使用 brew 安装,则 sudo /usr/local/mysql/support-files/mysq…...

redis分片集群架构
主从集群解决高并发,哨兵解决高可用问题。但是任然有两个问题没有解决:1海量数据存储问题;2高并发写的问题(如果服务中有大量写的请求) 那就可以采用分片集群架构解决这些问题 分片集群特征 分片集群中有多个master…...

关于物联网的基础知识(一)
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于物联网的基础知识(一&a…...