3 Storage 数据存取(最能体现实践经验)

  1. select 选存储结构
  2. 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) 把一个短网址转换成一个长网址

标准:

  1. 短网址的key的长度应为6 (不算域名和反斜杠)。 可用字符只有 [a-zA-Z0-9]. 比如: abcD9E
  2. 任意两个长的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(索引)

短链系统设计-存储设计相关推荐

  1. 短链系统设计-服务设计

    2 Service 服务 - 逻辑块聚类与接口设计 该系统其实很简单,只需要有一个 service即可:URL Service.由于 tiny url只有一个 UrlService: 本身其实就是个小 ...

  2. 系统设计——如何设计一个高性能的短链接系统?

    短链系统设计看起来很简单,但如何设计一个高性能短链系统呢,这也是面试中非常常见的一道设计题. 首先,为什么要用短链? 短链跳转的基本原理是什么? 短链生成的几种方法你知道吗? 高性能短链的架构如何设计 ...

  3. pb blob存储到image_【Filecoin相关】速懂 Filecoin 自认证存储设计

    本文由IPFS原力区 Taosheng shi 原创 Filecoin项目的发起人胡安于2019/10/22,在'slack'讨论群中公开了filecoin数据存储格式的细节,供团队讨论和审阅.众所周 ...

  4. Kafka的存储设计

    本文来说下 Kafka的存储选型 文章目录 概述 Kafka的存储难点是什么 Kafka的存储选型分析 存储领域的基础知识 Kafka 的存储选型考虑 Kafka 的存储设计 本文小结 概述 谈到 K ...

  5. 用c语言设计交通咨询系统,交通咨询系统设计课程设计.doc

    交通咨询系统设计课程设计 课 程 设 计 报 告 课程名称 数据结构 课题名称 交通咨询系统 专 业 班 级 学 号 姓 名 指导教师 2013 年 月 日 设计内容与设计要求 1设计内容 [问题描述 ...

  6. 自己做一个短链服务,设计思路分享!

    其实实现短链服务并不是很难,最主要还是需要知道一些设计思路,还需要有一些基础技术知识,例如:哈希算法.全局发号器等. 下面一起来学习如何设计一个短链服务吧! 短链的价值 网址大家都知道,很长的一串字符 ...

  7. 微型计算机温度控制系统课程设计,微机原理及其应用 微型计算机温度控制系统设计课程设计报告.doc...

    微机原理及其应用 微型计算机温度控制系统设计课程设计报告 <微机原理及其应用>课程设计报告 2011年3月2日 课程设计题目及系统功能介绍 微型计算机温度控制系统设计,假设工业现场温度范围 ...

  8. 7张图揭晓RocketMQ存储设计的精髓

    简介:RocketMQ 作为一款基于磁盘存储的中间件,具有无限积压能力,并提供高吞吐.低延迟的服务能力,其最核心的部分必然是它优雅的存储设计. RocketMQ 作为一款基于磁盘存储的中间件,具有无限 ...

  9. 【虚拟化实战】存储设计之七Block Size

    作者:范军 (Frank Fan)新浪微博:@frankfan7   微信:GetToCloud 在实战存储设计之六Latnecy我们介绍Latency过高的原因和一些建议.本文重点分析Block S ...

最新文章

  1. Android 修改手机hosts域名 (绑定host域名 )
  2. mysql读出varchar乱码_pymssql读取varchar字段中文显示乱码的问题分析
  3. 复合五点高斯公式计算(Python实现)
  4. 鸢尾花识别问题,萼片有什么用?
  5. python数据分析实战:数据可视化的一些基本操作
  6. mysql 修复错误连接_mysql 无法连接问题的定位和修复过程分享
  7. linux 文件理解,对linux中文件系统的理解
  8. c++求n的几次方_14.八年级数学:若a+b+c=1,怎么求 a+b+c的值?分式培优拓展
  9. 【OpenCV】入门学习资料汇总
  10. mac r 导出csv文件_R在Max OS进行导入和导出xlsx文件
  11. 备忘::我所用的第三方软件的源
  12. python实现app自动签到器_Python实现自动签到脚本代码示例
  13. JavaSwing_2.2: JButton(按钮)
  14. table表单的制作
  15. 支付宝api全(支付宝支付(app,h5,js),支付宝订单查询,支付宝退款,支付宝交易退款查询,支付宝提现,支付宝提现查询)
  16. [导入]MPQ 文件系统完成
  17. 如何查看kali的详细ip地址网关_在Linux中检查默认网关或路由器IP地址的四个命令...
  18. 【BP神经网络】西瓜分类和鸢尾花分类
  19. 管理工具-生产管理系统Mes
  20. EXCEL一个单元格内容分成多个单元格

热门文章

  1. 迅雷看看低价甩卖 无力回天有原因
  2. (zhuan) Some Talks about Dual Learning
  3. python的opencv的图像对象存储的颜色通道_OpenCV大型阵列类型Mat类
  4. java 为什么遍历的时候不能删除元素
  5. 基于MDKA5D31-EK_T70开发板的QT示例-demo05:计算器
  6. 微软又出大招!ChatGPT将加入云服务!
  7. 创建第一个 Rails 程序(使用mysql)
  8. 腾讯 android模拟器下载地址,腾讯手游模拟器
  9. 怎样做校园外卖配送系统创业?打造一体化服务校园平台如何进行?
  10. android 手机充电慢,安卓手机充电慢是怎么回事