一、考点聚焦

如何设计与实现一个短网址系统
1.什么是短网址系统?包含哪些功能(接口)
2.短网址系统的存储设计?需要存储哪些字段?
3.如何设计算法生成短网址?

二、什么是短网址系统?

TinyUrl Service
1.把一个长网址转成短网址的服务
2.比如 https://bitly.com/
3.转换之后网址的后缀不超过7位(字符或者数字)

场景和限制
使用场景:提供短网址服务为公司其他各业务服务
1.功能:一个长网址转成短网址并存储;根据短网址还原长url
2.要求短网址的后缀不超过7位(大小写字母和数字)
3.预估峰值插入请求数量级:数百;查询请求数量级:数千

数据存储设计:
根据需求设计数据存储方式
1.使用Mysql即可满足
2.需要的字段有哪些?

Mysql数据表:

字段 说明
id ID
token token
url 原网址
created_at 创建时间

三、算法实现设计

短网址生成算法有哪些?对比优缺点
1.两个APIlong2short_urlshort2long_url
2.常用算法:hash算法截取;自增序列算法
3.对比多种算法,我们采取自增序列算法实现

思路解析图:

进制转换:不断取余,倒序输出

def mybin(num):   # 10进制--> 2进制串if num == 0:return 0res = []while num:num, rem = divmod(num, 2)   # divmode()函数返回 num//2,  num%2res.append(str(rem))return ''.join(reversed(res))CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"def encode(num):if num == 0:return CHARS[0]res = []while num:num, rem = divmode(num, len(CHARS))  # 62res.append(CHARS[rem])return ''.join(reversed(res))print(encode(1))  # a
print(encode(62)) # 9

编码实现:
使用Flask框架演示本系统实现
1.代码里实现了短网址生成算法
2.数据库使用Mysql
3.计数器使用Redis

import osfrom flask import Flask, jsonify, render_template, request
from flask_mysqldb import MySQL
from flask.ext.redis import FlaskRedisapp = Flask(__name__)
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = os.getenv('MYSQL_PASS')
app.config['MYSQL_DB'] = 'test'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'mysql = MySQL(app)
redis_store = FlaskRedis(app)CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"def encode(num):if num == 0:return CHARS[0]res = []while num:num, rem = divmode(num, len(CHARS))  # 62res.append(CHARS[rem])return ''.join(reversed(res))@app.route('/shorten', methods=['POST'])
def shorten_url():long_url = request.json['url']index = int(redis_store.incr('SHORT_CNT'))token = encode(index)sql = "INSERT INTO short_url(token, url) VALUES(%s, %s)"cur = mysql.connection.cursor()cur.execute(sql, (token, long_url))mysql.connection.commit()short_url = 'https://short.com/' + tokenreturn jsonify(dict(url=short_url))@app.route('/')
def index():return render_template('index.html')if __name__ == '__main__':app.run(debug=1)

数据库表结构:

CREATE TABLE short_url(id bigint unsigned NOT NULL AUTO_INCREMENT,token varchar(10),url varchar(2048),created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY ('id')KEY `idx_token` (`token`)
);

回答重点:
回答要点,最好图文并茂
1.遵守三个要素回答
2.包含数据表的设计、api的设计、算法的设计
3.图文并茂,有数据表、接口定义、流程图

10-2 系统设计真题解析:短网址系统的设计与实现相关推荐

  1. 视频教程-2020年软考系统架构设计师-上午历年真题解析视频培训课程-软考

    2020年软考系统架构设计师-上午历年真题解析视频培训课程 河北师范大学软件学院优秀讲师,项目经理资质,担任操作系统原理.软件工程.项目管理等课程教学工作.参与十个以上百万级软件项目管理及系统设计工作 ...

  2. android广告页白屏_年度整理!2056页《大厂安卓岗面试真题解析合集》火爆全网...

    前言 2020年还有最后一个月就结束了,时间一眨眼就过去了.今年面试有没有被面试官虐呢,明年跳槽想跳去哪个大厂呢,这是个问题.说实话,今年我面试也被虐了,为了明年能找到一份心怡的工作,特地的从朋友那里 ...

  3. 视频教程-2020软考软件设计师-上午真题解析视频课程-软考

    2020软考软件设计师-上午真题解析视频课程 河北师范大学软件学院优秀讲师,项目经理资质,担任操作系统原理.软件工程.项目管理等课程教学工作.参与十个以上百万级软件项目管理及系统设计工作.在<计 ...

  4. 2021年上半年软考网络规划师真题解析

    1.为防范国家数据安全风险.维护国家安全.保障公共利益,2021 年7月,中国网络安全审查办公室发布公告,对"滴滴出行"."运满满" ."货车帮&qu ...

  5. 视频教程-2020软考数据库系统工程师-上午真题解析培训视频课程-软考

    2020软考数据库系统工程师-上午真题解析培训视频课程 河北师范大学软件学院优秀讲师,项目经理资质,担任操作系统原理.软件工程.项目管理等课程教学工作.参与十个以上百万级软件项目管理及系统设计工作.在 ...

  6. 蓝桥杯Java大学C组近三年真题解析(三)——暴力、模拟题

    目录 第十届 求和 题目 题解 代码 矩形切割 题目 题解一 代码 代码 代码 题解二 代码 不同子串 题目 题解 代码 质数 题目 题解 代码 最大降雨量 题目 题解 代码 旋转 题目 题解 代码 ...

  7. 蓝桥杯练习系统习题-历年真题解析2(完整版)

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 蓝桥杯练习系统习题-历年真题解析2 题目搜索方式:Ctrl+F--> 输入题目名称-&g ...

  8. 蓝桥杯练习系统习题-历年真题解析1(完整版)

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 蓝桥杯练习系统习题-历年真题解析1 题目搜索方式:Ctrl+F--> 输入题目名称-&g ...

  9. java蓝桥杯凑算是,第七届蓝桥杯JAVA B组真题解析-凑算式(第三题)

    第七届蓝桥杯JAVA B组真题解析-凑算式(第三题) 凑算式 A+B/C+DEF/GHI =10 (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. ...

  10. input python 验证int_全国计算机二级Python真题解析-1

    以下分享的是真题第一套中的操作题部分,操作题一共6道共计60分(5分/道*3道+10分+15分+20分),今天讲解的这道题是前面5道大题,最后一道题有时间再讲. 第一题(试卷第41题): (41)考生 ...

最新文章

  1. CentOS内核优化提示:cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有那个文件或目录...
  2. C# 的关键字系列 (3 of n)
  3. tableView下沉
  4. 历届 SIGGRAPH 上有什么新奇、有趣的项目?
  5. 天池赛题解析:零基础入门语义分割-地表建筑物识别-CV语义分割实战(附部分代码)
  6. JVM加载class文件的原理简述
  7. .NET开发人员如何开始使用ML.NET
  8. GIL对多线程的影响
  9. a标签鼠标放上去变色_一切为了集齐一套装备:杜伽LEO600游戏鼠标和P300鼠标垫简评...
  10. 2022年3月编程语言排行榜:Lua重新回到前20
  11. [内附完整源码和文档] 基于MySql和JSP的题库管理系统
  12. 计算机主板外部接口功能,笔记本电脑主板接口功能分享
  13. postgresql 日期相减
  14. Unity材质偏移(贴图纹理偏移)实现流动效果【记录一下】
  15. Autojs 3.0文档学习之设备信息
  16. 多重if-else的精简方式
  17. 中国电子学会-全国青少年机器人技术等级考试标准 (1-6级)
  18. 工欲善其事必先利其器–SimpleTestBed
  19. c++二分法求平方根
  20. 在线画图软件draw.io

热门文章

  1. dns劫持教您dns被劫持如何修复、dns劫持如何修复
  2. 分享一些可用的淘宝(1688)关于订单信息获取的相关接口(开放API收费)
  3. 网络安全笔记-14-网络层-路由
  4. linux命令行使用for循环,linux命令:for循环
  5. 机器学习判定红楼梦后40回是否曹雪芹所写
  6. Reinforcement Learning from Simultaneous Human and MDP Reward个人理解
  7. # C#程序设计习题_1(西安交通大学)
  8. java误删的信息怎么恢复_记一次线上表数据误删恢复过程
  9. Python字典知识总结
  10. 树莓派系统安装 3.5寸LCD驱动安装 ssh远程链接