前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Serverless-实现一个短网址服务(一)

Serverless-实现一个短网址服务(一)

原创
作者头像
Thor
修改于 2020-05-25 02:28:30
修改于 2020-05-25 02:28:30
1.3K0
举报
文章被收录于专栏:云上服务云上服务

要点

将一个长url生成一个短链接是很常见的需求,本文尝试通过serverless的方式来提供这个功能,主要有两部分内容:

  1. 一个简单的短链接生成方案
  2. 腾讯云的scf函数如何使用第三方依赖库

如何生成短链接

这里使用了一个很简单的方案,提交url时,先通过mysql的自增id获取一个整数,表结构大致如下:

代码语言:txt
AI代码解释
复制
CREATE TABLE `short_url` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `hash` varchar(45) DEFAULT NULL,
  `name` varchar(45) NOT NULL,
  `url` varchar(1024) NOT NULL,
  `created_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
)

这样insert数据的时候,id会自增,获取到这个自增的整数值,然后使用hashids这个库将这个id转换为一个短字符串:

https://hashids.org/python/

将这个短字符串作为短网址域名的路径就可以使用了。

腾讯云scf如何使用第三方库

由于使用到了hashids这个第三方库,就需要将这个库也打包一起上传到腾讯云,这里需要注意的要点就是安装hashids库的命令:

代码语言:txt
AI代码解释
复制
pip install hashids -t 云函数代码所在目录

注意后面的 -t 参数,将依赖库安装在云函数的代码所在的目录,这样在使用scf命令打包上传时,依赖库也会被一起上传

直接贴代码

代码语言:txt
AI代码解释
复制
# -*- coding: utf8 -*-
from os import getenv
from hashids import Hashids
import json
import pymysql
from pymysql.err import OperationalError

mysql_conn = None


def init_db():
    global mysql_conn
    if not mysql_conn:
        mysql_conn = pymysql.connect(
            host=getenv('DB_BING_HOST'),
            port=int(getenv('DB_BING_PORT')),
            user=getenv('DB_BING_USER'),
            password=getenv('DB_BING_PASSWORD'),
            db=getenv('DB_BING_DATABASE'),
            charset='utf8mb4',
            autocommit=True
        )


def close_db():
    global mysql_conn
    if mysql_conn:
        mysql_conn.close()

def __get_cursor():
    try:
        return mysql_conn.cursor()
    except OperationalError:
        mysql_conn.ping(reconnect=True)
        return mysql_conn.cursor()


def save2db(name, url):
    sql_template = """INSERT INTO `bing`.`short_url` (`name`,  `url`) VALUES  (%s,%s)"""

    with __get_cursor() as cursor:
        cursor.execute(sql_template, (name, url))
        auto_id = cursor.lastrowid
        return auto_id


def set_hash(id, hash):
    sql_template = """UPDATE `bing`.`short_url` SET `hash` = %s WHERE `id` = %s;"""
    with __get_cursor() as cursor:
        cursor.execute(sql_template, (hash, id))


def main_handler(event, context):
    # 读取请求参数
    if "requestContext" not in event.keys():
        return {"errorCode":410,"errorMsg":"event is not come from api gateway"}
    request = event["requestContext"]
    query = json.loads(event['body'])
    name = query.get('name')
    url = query.get('url')

    #初始化数据库连接
    init_db()
    #插入记录,返回自增id
    auto_id = save2db(name, url)
    #生成短字符串
    hashid = Hashids(salt="bangbangbang")
    hash = hashid.encode(auto_id)
    print(auto_id, hash)
    #将短字符串保存到记录中
    set_hash(int(auto_id), hash)
    #关闭数据库连接
    close_db()
    return  {"code":200,"data": hash} 

测试

在本地创建一个测试数据文件,event.json:

代码语言:txt
AI代码解释
复制
{
    "requestContext": {},
    "body": "{\"name\": \"测试\",\"url\": \"http://www.qq.com\"}"
}

本地测试验证:

代码语言:txt
AI代码解释
复制
cat event.json |scf native invoke

将返回的短字符串拼接到你想使用的域名后面,就可以获得一个自己的短网址生成器了:

代码语言:txt
AI代码解释
复制
http://short.url/zv

下一篇将通过云函数的方式来实现短链接的跳转功能

需要注意的问题

腾讯云提供了serverless_db_sdk,但是经尝试,这个sdk里面获取到的cousor对象无法获取lastrowid,也就是取不到每次插入记录后的自增id,所以这里自行使用pymysql来操作数据库,所以务必记得在最后要手动关闭链接

生成短网址后实现短链接跳转的函数可参考下一篇 Serverless-实现一个短网址服务(二)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Serverless-实现一个短网址服务(二)
上一篇 Serverless-实现一个短网址服务(一)实现了一个生成短链接的云函数,这一篇完成后半部分,实现短链接的跳转。主要需要注意的内容有:
Thor
2020/06/13
1.5K0
Serverless-实现bing每日壁纸API(一)
serverless函数的开发方式很适合用来实现一些简单的小功能,比如接下来要做的这个,抓取bing搜索的每日壁纸图片,功能非常的简单:
Thor
2020/05/16
9650
Serverless-实现bing每日壁纸API(二)
上一篇使用腾讯云的云函数(Serverless-实现bing每日壁纸API(一)),实现了每日定时抓取bing壁纸并保存到数据库的功能,这一篇继续利用云函数实现一个获取bing壁纸列表的api
Thor
2020/05/18
8100
短网址系统设计
短网址系统负责将某个长网址缩短为一个很短的网址,用户通过访问这个短网址可以重定向到原本的长网址。
大忽悠爱学习
2023/11/02
5550
短网址系统设计
Serverless 与 Flask 框架结合进行 Blog 开发
随着时间的发展,Serverless 架构越来越火热,其按量付费、弹性伸缩等诸多优质特性,让人眼前一亮,不得不惊叹云计算为我们带来的便利。 本实践通过一个博客系统的开发,和大家简单地体验一下基于 Serverless 架构的博客系统是什么样的。 功能展示 先看一下我们要实现的效果: 一、前台功能 列表页 内容页 二、后台功能 登录功能 列表页 表单页 项目开发 项目开发过程主要就是数据库的增删改查,为了更加适应 Serverless 架构下的项目开发,也为了提高项目的开发效率特总结了相
腾讯云serverless团队
2020/06/03
1.1K0
使用 Serverless 创建一个简单的短网址服务
serverless init flask-starter --name url-shortener
donghui
2021/01/06
1.1K0
使用 Serverless 创建一个简单的短网址服务
手把手教你造轮子:这个价值100万的短网址微服务,我送给你
网上已经有产品,用着还不错。可是,作为程序员,从零开始造轮子,开发一个属于自己的短网址服务器,这想法amazing!
程序员小助手
2020/04/08
5960
Python后端技术栈(八)--系统设计
Breathe. Take care. Stand still for a minute. What you are looking for might just be looking for you too.
小闫同学啊
2019/07/18
1.6K0
Python后端技术栈(八)--系统设计
如何设计短网址服务
本文虽然是作者几年前的文章,但并不过时!文中介绍了如何设计短网址服务,简洁地指出了该服务要注意的问题和解决方案。下面是正文:
HelloGitHub
2021/05/14
1.2K0
如何设计短网址服务
如何设计一个短网址系统
网址短链接就是一些长链接的别名,比如 bit.ly, goo.gl, qlink.me,输入这些链接会跳转到对应的长链接。
somenzz
2021/03/24
1.8K0
Python基础24-MySQL模块pymysql
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
2.7K0
Python基础24-MySQL模块pymysql
短链系统设计-存储设计
scalability 要求多高?存储和 qps 都不高,单机都能搞定。sql+1
JavaEdge
2022/09/14
6020
短链系统设计-存储设计
基于 Serverless 架构的编程学习小工具
之前我做过一个在线编程的软件,目前用户量大概有几十万,通过这个 App 不仅仅可以进行代码的编写、运行还可以进行编程的学习。自己一直对 Serverless 架构情有独钟,恰好赶到我的这个 App 学习板块被很多人吐槽难用,索性就对这个学习板块进行重构,并且打算在重构的时候,将这个学习板块搬上 Serverless 架构。 基于 Serverless 架构重构是出于两个方面考虑: 一是 Serverless 架构能让个人开发者的运维工作变得简单,尤其是不用操心服务器,也不用关心流量洪峰(当然,对于我的个人
腾讯云serverless团队
2020/06/03
5410
如何设计一个短链接系统
短链接是一种将长URL地址转换为较短、易于记忆的链接的技术。它通过使用特定的算法或服务将长链接压缩成更短的形式,以便在限制字符长度或需要更简洁的场景下使用。
柯柏技术笔记
2024/01/10
8790
如何设计一个短链接系统
pymysql
pymsql是python中操作的MYsql的模块,其使用方法和MySQLdb几乎相同
Wyc
2018/09/11
4.2K0
pymysql
字节二面:100Wqps短链系统,如何设计?
这段时间,在整理知识星球中面试专栏时看到这么一个字节跳动的二面真题:100Wqps短链系统,怎么设计?
码猿技术专栏
2023/05/01
4.5K1
字节二面:100Wqps短链系统,如何设计?
微信公众号迁移Serverless详解
3月腾讯云函数计算开放测试, 看到的第一反应是这种Serverless太适合做微信公众号的后端来实现自动应答了。
朱小一
2018/07/11
1.3K0
SCF:搭建智能客服/问答机器人
在实际生产生活中,我们经常会遇到别人问我们问题,而且这个问题是常见的,那么我们就会感到很烦躁:为啥总有人问相似的问题?再仔细冷静一下:我们可不可以做一个机器人,他可以自动回答一些问题?今天本文,就通过简单的方法,在SCF上部署一个问答机器人/智能客服,来为各位有需求的小伙伴,解决实际问题,当然,这篇文章也算是抛砖引玉。一方面,扩展一下大家使用SCF的思路,另一方面温故一下如何打包的方法,最后也尝试使用新的触发方法:云API触发。
None-xiaomi
2019/06/27
2.2K0
Serverless实践系列(六):云函数+API,告知天气信息
首先想要说一下,为什么要把云函数与API网关进行结合? 我们通常用云函数SCF写一个函数应用,这个函数应用可能多种多样,例如之前介绍的包括OJ系统的判题功能、通过NLP实现文本摘要功能......那么,怎么把这些功能简单快速的结合到实际项目中,尤其是Web项目中呢?本文通过一个简单的小例子实现云函数SCF与API网关的结合,算作抛砖引玉,希望大家在自己的Web项目中,可以通过SCF+API网关实现更多功能。 任务说明 通过SCF编写一个两个爬虫程序,分别是通过IP地址获得IP归属地信息、通过地址获得天气
腾讯云serverless团队
2019/08/08
1.9K0
Serverless实践系列(六):云函数+API,告知天气信息
【scrapy】scrapy爬取数据指南
scrapy是爬虫界常用的基于Python爬虫框架,但是网上找了很多这类的文章,发现有多处错误,故为了让刚想尝试爬虫的蜘蛛们少走点坑,故把最新的方法奉上。 在此之前,请先更新你的pip版本,并安装scrapy , pymysql。
前端修罗场
2023/10/07
5530
【scrapy】scrapy爬取数据指南
相关推荐
Serverless-实现一个短网址服务(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档