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数据表:

字段说明
idID
tokentoken
url原网址
created_at创建时间

三、算法实现设计

短网址生成算法有哪些?对比优缺点
1.两个APIlong2short_urlshort2long_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 系统设计真题解析:短网址系统的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章

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

短链系统设计-用户自定义短链

10-1 系统设计考点解析

10-1 系统设计考点解析

10-1 系统设计考点解析

2021年下半年系统架构设计师下午真题及答案解析