短链系统设计-存储设计
3 Storage 数据存取(最能体现实践经验)
- select 选存储结构
- scheme 细化数据表
3.1 SQL V.S NoSQL
需要事务吗?No,nosql+1
需要丰富的 sql query 吗?no,nosql+1
想偷懒吗?tiny url需要写的代码不复杂,nosql+1
qps高吗?2k,不高。sql+1
scalability 要求多高?存储和 qps 都不高,单机都能搞定。sql+1
- sql 需要自己写代码来 scale
- nosql,这些都帮你做了
是否需要 sequential ID?取决于你的算法
- sql 提供 auto_increment 的 sequencetial ID,即 1,2,3
- nosql 的 ID 不是 sequential
3.2 算法
long ur 转成一个 6 位的 short url。给出一个长网址,返回一个短网址。
实现两个方法:
longToShort(url)
把一个长网址转换成一个以http://tiny.url/
开头的短网址shortToLong(url)
把一个短网址转换成一个长网址
标准:
- 短网址的key的长度应为6 (不算域名和反斜杠)。 可用字符只有
[a-zA-Z0-9]
. 比如:abcD9E
- 任意两个长的url不会对应成同一个短url,反之亦然。
用两个哈希表:
- 一个是短网址映射到长网址
- 一个是长网址映射到短网址
短网址是固定的格式: “http://tiny.url/” + 6个字符, 字符可任意。
为避免重复, 我们可以按照字典序依次使用, 或者在随机生成的基础上用一个集合来记录是否使用过。
使用哈希函数(不可行)
如取 long url的 MD5 的最后 6 位:
- 快
- 难以设计一个无哈希冲突的哈希算法
随机生成 shortURL+DB去重
随机取一个 6 位的 shortURL,若没使用过,就绑定到改 long url。
public String long2Short(String url) {while(true) {String shortURL = randomShortURL();if (!databse.filter(shortURL=shortURL).exists()) {database.create(shortURL=shortURL, longURL=url);return shortURL;}}}public class TinyUrl {public TinyUrl() {long2Short = new HashMap<String, String>();short2Long = new HashMap<String, String>();}/*** @param url a long url* @return a short url starts with http://tiny.url/*/public String longToShort(String url) {if (long2Short.containsKey(url)) {return long2Short.get(url);}while (true) {String shortURL = generateShortURL();if (!short2Long.containsKey(shortURL)) {short2Long.put(shortURL, url);long2Short.put(url, shortURL);return shortURL;}}}/*** @param url a short url starts with http://tiny.url/* @return a long url*/public String shortToLong(String url) {if (!short2Long.containsKey(url)) {return null;}return short2Long.get(url);}private String generateShortURL() {String allowedChars = "0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ";Random rand = new Random();String shortURL = "http://tiny.url/";for (int i = 0; i < 6; i++) {int index = rand.nextInt(62);shortURL += allowedChars.charAt(index);}return shortURL;}
}
优点:实现简单
缺点:生成短链接的速度,随着短链接越多而越慢
关系型数据库表:只需Short key和 long url两列,并分别建立索引
也可使用 nosql,但需要建立两张表:
- 根据 long 查询 short
key=longurl 列=shorturl value=null or timestamp - 根据 short 查询 long
key=shorturl 列=longurl value=null or timestamp
进制转换 Base32(微博实现方案)
Base62:
- 将 6 位 short url 看做一个 62 进制数(0-9,a-z,A-Z)
- 每个 short url 对应到一个整数
- 该整数对应 DB 表的主键
6 位可表示的不同 URL:
- 5 位 = 62^5=0.9B= 9亿
- 6 位 = 62^6=57B= 570亿
- 7 位 = 62^7=3.5T= 35000亿
优点:效率高
缺点:强依赖于全局的自增 id
public class TinyUrl {public static int GLOBAL_ID = 0;private HashMap<Integer, String> id2url = new HashMap<Integer, String>();private HashMap<String, Integer> url2id = new HashMap<String, Integer>();private String getShortKey(String url) {return url.substring("http://tiny.url/".length());}private int toBase62(char c) {if (c >= '0' && c <= '9') {return c - '0';}if (c >= 'a' && c <= 'z') {return c - 'a' + 10;}return c - 'A' + 36;}private int shortKeytoID(String short_key) {int id = 0;for (int i = 0; i < short_key.length(); ++i) {id = id * 62 + toBase62(short_key.charAt(i));}return id;}private String idToShortKey(int id) {String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";String short_url = "";while (id > 0) {short_url = chars.charAt(id % 62) + short_url;id = id / 62;}while (short_url.length() < 6) {short_url = "0" + short_url;}return short_url;}/*** @param url a long url* @return a short url starts with http://tiny.url/*/public String longToShort(String url) {if (url2id.containsKey(url)) {return "http://tiny.url/" + idToShortKey(url2id.get(url));}GLOBAL_ID++;url2id.put(url, GLOBAL_ID);id2url.put(GLOBAL_ID, url);return "http://tiny.url/" + idToShortKey(GLOBAL_ID);}/*** @param url a short url starts with http://tiny.url/* @return a long url*/public String shortToLong(String url) {String short_key = getShortKey(url);int id = shortKeytoID(short_key);return id2url.get(id);}
}
因为要用到自增 id,所以只能用关系型 DB 表:
id主键、long url(索引)
短链系统设计-存储设计相关推荐
- 短链系统设计-服务设计
2 Service 服务 - 逻辑块聚类与接口设计 该系统其实很简单,只需要有一个 service即可:URL Service.由于 tiny url只有一个 UrlService: 本身其实就是个小 ...
- 系统设计——如何设计一个高性能的短链接系统?
短链系统设计看起来很简单,但如何设计一个高性能短链系统呢,这也是面试中非常常见的一道设计题. 首先,为什么要用短链? 短链跳转的基本原理是什么? 短链生成的几种方法你知道吗? 高性能短链的架构如何设计 ...
- pb blob存储到image_【Filecoin相关】速懂 Filecoin 自认证存储设计
本文由IPFS原力区 Taosheng shi 原创 Filecoin项目的发起人胡安于2019/10/22,在'slack'讨论群中公开了filecoin数据存储格式的细节,供团队讨论和审阅.众所周 ...
- Kafka的存储设计
本文来说下 Kafka的存储选型 文章目录 概述 Kafka的存储难点是什么 Kafka的存储选型分析 存储领域的基础知识 Kafka 的存储选型考虑 Kafka 的存储设计 本文小结 概述 谈到 K ...
- 用c语言设计交通咨询系统,交通咨询系统设计课程设计.doc
交通咨询系统设计课程设计 课 程 设 计 报 告 课程名称 数据结构 课题名称 交通咨询系统 专 业 班 级 学 号 姓 名 指导教师 2013 年 月 日 设计内容与设计要求 1设计内容 [问题描述 ...
- 自己做一个短链服务,设计思路分享!
其实实现短链服务并不是很难,最主要还是需要知道一些设计思路,还需要有一些基础技术知识,例如:哈希算法.全局发号器等. 下面一起来学习如何设计一个短链服务吧! 短链的价值 网址大家都知道,很长的一串字符 ...
- 微型计算机温度控制系统课程设计,微机原理及其应用 微型计算机温度控制系统设计课程设计报告.doc...
微机原理及其应用 微型计算机温度控制系统设计课程设计报告 <微机原理及其应用>课程设计报告 2011年3月2日 课程设计题目及系统功能介绍 微型计算机温度控制系统设计,假设工业现场温度范围 ...
- 7张图揭晓RocketMQ存储设计的精髓
简介:RocketMQ 作为一款基于磁盘存储的中间件,具有无限积压能力,并提供高吞吐.低延迟的服务能力,其最核心的部分必然是它优雅的存储设计. RocketMQ 作为一款基于磁盘存储的中间件,具有无限 ...
- 【虚拟化实战】存储设计之七Block Size
作者:范军 (Frank Fan)新浪微博:@frankfan7 微信:GetToCloud 在实战存储设计之六Latnecy我们介绍Latency过高的原因和一些建议.本文重点分析Block S ...
最新文章
- Android 修改手机hosts域名 (绑定host域名 )
- mysql读出varchar乱码_pymssql读取varchar字段中文显示乱码的问题分析
- 复合五点高斯公式计算(Python实现)
- 鸢尾花识别问题,萼片有什么用?
- python数据分析实战:数据可视化的一些基本操作
- mysql 修复错误连接_mysql 无法连接问题的定位和修复过程分享
- linux 文件理解,对linux中文件系统的理解
- c++求n的几次方_14.八年级数学:若a+b+c=1,怎么求 a+b+c的值?分式培优拓展
- 【OpenCV】入门学习资料汇总
- mac r 导出csv文件_R在Max OS进行导入和导出xlsx文件
- 备忘::我所用的第三方软件的源
- python实现app自动签到器_Python实现自动签到脚本代码示例
- JavaSwing_2.2: JButton(按钮)
- table表单的制作
- 支付宝api全(支付宝支付(app,h5,js),支付宝订单查询,支付宝退款,支付宝交易退款查询,支付宝提现,支付宝提现查询)
- [导入]MPQ 文件系统完成
- 如何查看kali的详细ip地址网关_在Linux中检查默认网关或路由器IP地址的四个命令...
- 【BP神经网络】西瓜分类和鸢尾花分类
- 管理工具-生产管理系统Mes
- EXCEL一个单元格内容分成多个单元格
热门文章
- 迅雷看看低价甩卖 无力回天有原因
- (zhuan) Some Talks about Dual Learning
- python的opencv的图像对象存储的颜色通道_OpenCV大型阵列类型Mat类
- java 为什么遍历的时候不能删除元素
- 基于MDKA5D31-EK_T70开发板的QT示例-demo05:计算器
- 微软又出大招!ChatGPT将加入云服务!
- 创建第一个 Rails 程序(使用mysql)
- 腾讯 android模拟器下载地址,腾讯手游模拟器
- 怎样做校园外卖配送系统创业?打造一体化服务校园平台如何进行?
- android 手机充电慢,安卓手机充电慢是怎么回事