10-2 系统设计真题解析:短网址系统的设计与实现
Posted WinvenChang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10-2 系统设计真题解析:短网址系统的设计与实现相关的知识,希望对你有一定的参考价值。
一、考点聚焦
如何设计与实现一个短网址系统
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.两个API
:long2short_url
、short2long_url
2.常用算法:hash
算法截取;自增序列算法
3.对比多种算法,我们采取自增序列算法实现
思路解析图:
进制转换:不断取余,倒序输出
def mybin(num): # 10进制--> 2进制串
if num == 0:
return 0
res = []
while num:
num, rem = divmod(num, 2) # divmode()函数返回 num//2, num%2
res.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)) # 62
res.append(CHARS[rem])
return ''.join(reversed(res))
print(encode(1)) # a
print(encode(62)) # 9
编码实现:
使用Flask
框架演示本系统实现
1.代码里实现了短网址生成算法
2.数据库使用Mysql
3.计数器使用Redis
import os
from flask import Flask, jsonify, render_template, request
from flask_mysqldb import MySQL
from flask.ext.redis import FlaskRedis
app = 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)) # 62
res.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/' + token
return 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 系统设计真题解析:短网址系统的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章