拓客軟件網(wǎng)站百度seo關(guān)鍵詞優(yōu)化
【騰訊云 TDSQL-C Serverless 產(chǎn)品體驗(yàn)】基于TDSQL-C 存儲(chǔ)爬取的QQ音樂歌單數(shù)據(jù)
文章目錄
- 【騰訊云 TDSQL-C Serverless 產(chǎn)品體驗(yàn)】基于TDSQL-C 存儲(chǔ)爬取的QQ音樂歌單數(shù)據(jù)
- 前言
- 出現(xiàn)的背景
- 一、TDSQL-C數(shù)據(jù)庫是什么?
- 二、TDSQL-C 的特點(diǎn)
- 三、TDSQL-C的應(yīng)用場(chǎng)景
- 四、基于TDSQL-C 存儲(chǔ)爬取的QQ音樂歌單數(shù)據(jù)
- 1、創(chuàng)建TDSQL-C Serverless數(shù)據(jù)庫
- 2、創(chuàng)建所需數(shù)據(jù)庫并通過DMC進(jìn)行數(shù)據(jù)庫管理
- 3、構(gòu)建QQ音樂歌單爬蟲
- 3.1 初始化框架環(huán)境
- 3.2 在spiders下創(chuàng)建分類爬蟲
- 3.3 在spiders下創(chuàng)建歌單爬蟲
- 4、進(jìn)行數(shù)據(jù)庫狀態(tài)觀察
- 總結(jié)
- 參考文獻(xiàn)
前言
最近有幸參與了騰訊云舉辦的 騰訊云 TDSQL-C
產(chǎn)品體驗(yàn)活動(dòng)。在這個(gè)過程中,通過了解 TDSQL-C
的產(chǎn)品和實(shí)踐,讓我受益非淺,原來數(shù)據(jù)庫還能這么玩! 也讓我真正體會(huì)到了降本增效這個(gè)詞的意義。
在看到活動(dòng)的介紹和微信群的講解后,我馬不停蹄地開始了自己摸索。首先是跟著群里小助手發(fā)的實(shí)驗(yàn)手冊(cè),體驗(yàn)了一下整個(gè)產(chǎn)品的業(yè)務(wù)流程。
隨后又查看官方的產(chǎn)品文檔,文檔非常的簡(jiǎn)潔明了,然后根據(jù)這些資料開始了我的第一個(gè) TDSQL-C
程序,基于 TDSQL-C
數(shù)據(jù)庫構(gòu)建了一個(gè)基于 Vue
的問卷調(diào)查系統(tǒng),親身體驗(yàn)了 TDSQL-C
帶來的高性能、彈性可靠服務(wù),整個(gè)過程十分絲滑。
下面就來整理,分享一下我的操作和感悟,希望能夠幫助到其他同學(xué)。
出現(xiàn)的背景
傳統(tǒng)數(shù)據(jù)庫為什么被云數(shù)據(jù)庫替代?
關(guān)于 TDSQL-C
的出現(xiàn),我覺得需要先從云數(shù)據(jù)庫開始了解,傳統(tǒng)的本地?cái)?shù)據(jù)庫部署需要企業(yè)自己購買、維護(hù)硬件設(shè)備和管理數(shù)據(jù)庫軟件,這對(duì)于資源有限的中小企業(yè)來說可能是一項(xiàng)昂貴和繁瑣的任務(wù)。同時(shí),傳統(tǒng)數(shù)據(jù)庫在面對(duì)大規(guī)模的數(shù)據(jù)處理和高并發(fā)訪問時(shí)可能會(huì)遇到性能瓶頸和可用性問題。云數(shù)據(jù)庫的出現(xiàn)解決了這些問題。它將數(shù)據(jù)庫部署在云平臺(tái)上,并提供彈性的計(jì)算和存儲(chǔ)資源,使用戶能夠根據(jù)實(shí)際需求按需擴(kuò)展數(shù)據(jù)庫的容量和性能。云數(shù)據(jù)庫還提供高可用性和可靠性,通過數(shù)據(jù)備份、冗余存儲(chǔ)和容災(zāi)機(jī)制來保護(hù)數(shù)據(jù)的安全和可恢復(fù)性。此外,云數(shù)據(jù)庫還提供了便捷的管理和監(jiān)控工具,簡(jiǎn)化了數(shù)據(jù)庫的操作和維護(hù)過程。
serverless數(shù)據(jù)庫帶來了什么好處?
而云 Serverless
數(shù)據(jù)庫的出現(xiàn)則是為了進(jìn)一步提供更高的靈活性和經(jīng)濟(jì)效益。傳統(tǒng)的數(shù)據(jù)庫需要預(yù)先配置和維護(hù)一定數(shù)量的計(jì)算資源,而這些資源在閑置時(shí)仍然需要付費(fèi)。而 Serverless
數(shù)據(jù)庫采用按需付費(fèi)的模式,它根據(jù)實(shí)際的計(jì)算和存儲(chǔ)資源使用量來計(jì)費(fèi),無需預(yù)先配置資源。這使得用戶可以根據(jù)實(shí)際需求動(dòng)態(tài)地?cái)U(kuò)展和縮減數(shù)據(jù)庫的資源,避免了資源浪費(fèi)和額外的成本支出。Serverless
數(shù)據(jù)庫還可以自動(dòng)管理和優(yōu)化資源,用戶只需專注于應(yīng)用開發(fā),而無需關(guān)注底層基礎(chǔ)設(shè)施的管理。
而 TDSQL-C
是騰訊云自研的新一代云原生關(guān)系型數(shù)據(jù)庫。融合了傳統(tǒng)數(shù)據(jù)庫、云計(jì)算與新硬件技術(shù)的優(yōu)勢(shì),100%兼容 MySQL
,為用戶提供極致彈性、高性能、高可用、高可靠、安全的數(shù)據(jù)庫服務(wù)。實(shí)現(xiàn)超百萬 QPS
的高吞吐、PB
級(jí)海量分布式智能存儲(chǔ)、Serverless
秒級(jí)伸縮,助力企業(yè)加速完成數(shù)字化轉(zhuǎn)型。
Serverless 服務(wù)是騰訊云自研的新一代云原生關(guān)系型數(shù)據(jù)庫 TDSQL-C MySQL
版的無服務(wù)器架構(gòu)版,是全 Serverless
架構(gòu)的云原生數(shù)據(jù)庫。Serverless
服務(wù)支持按實(shí)際計(jì)算和存儲(chǔ)資源使用量收取費(fèi)用,不用不付費(fèi),將騰訊云云原生技術(shù)普惠用戶。
總的來說,云數(shù)據(jù)庫和云 Serverless 數(shù)據(jù)庫的產(chǎn)生是為了滿足不同規(guī)模和需求的用戶對(duì)于數(shù)據(jù)存儲(chǔ)和處理的需求,并提供更靈活、可擴(kuò)展和經(jīng)濟(jì)高效的解決方案。
一、TDSQL-C數(shù)據(jù)庫是什么?
TDSQL-C MySQL
版基于 Cloud Native
設(shè)計(jì)理念,既融合了商業(yè)數(shù)據(jù)庫穩(wěn)定可靠、高性能、可擴(kuò)展的特征,又具有開源云數(shù)據(jù)庫簡(jiǎn)單開放、高效迭代的優(yōu)勢(shì)。
我們來理解一下這段描述, Cloud Native
設(shè)計(jì)理念是什么?
Cloud Native 設(shè)計(jì)理念是一種在云計(jì)算環(huán)境下進(jìn)行應(yīng)用開發(fā)和部署的方法論和思維方式,目標(biāo)是將應(yīng)用程序和基礎(chǔ)設(shè)施解耦,使得應(yīng)用程序能夠更好地適應(yīng)云環(huán)境的動(dòng)態(tài)性和彈性,并提供更好的可伸縮性、可靠性和可管理性。它能夠幫助開發(fā)者更快速、高效地構(gòu)建和交付應(yīng)用程序,并更好地應(yīng)對(duì)日益復(fù)雜和變化的業(yè)務(wù)需求。
基于這個(gè)設(shè)計(jì)方式,所以 TDSQL-C MySQL
版可以為為用戶提供具備超高彈性、高性能、海量存儲(chǔ)、安全可靠的數(shù)據(jù)庫服務(wù),以可幫助企業(yè)輕松應(yīng)對(duì)諸如商品訂單等高頻交易、伴隨流量洪峰的快速增長(zhǎng)業(yè)務(wù)、游戲業(yè)務(wù)、歷史訂單等大數(shù)據(jù)量低頻查詢、金融數(shù)據(jù)安全相關(guān)、開發(fā)測(cè)試、成本敏感等的業(yè)務(wù)場(chǎng)景。
二、TDSQL-C 的特點(diǎn)
我找到了一些關(guān)于我們?cè)谶x擇底層組件時(shí)候需要關(guān)注的一些特點(diǎn),憑什么 TDSQL-C
值得我們選擇呢?
- 完全兼容
TDSQL-C MySQL
版將開源數(shù)據(jù)庫的計(jì)算和存儲(chǔ)分離,存儲(chǔ)構(gòu)建在騰訊云分布式云存儲(chǔ)服務(wù)之上,計(jì)算層全面兼容開源數(shù)據(jù)庫引擎 MySQL 5.7、8.0
,業(yè)務(wù)無需改造即可平滑遷移。
- 超高性能
單節(jié)點(diǎn)百萬 QPS
的超高性能,可以滿足高并發(fā)高性能的場(chǎng)景,保證關(guān)鍵業(yè)務(wù)的連續(xù)性,并可進(jìn)一步提供讀寫分離以及讀寫擴(kuò)展性。
- 海量存儲(chǔ)
最高支持 PB 級(jí)的海量存儲(chǔ),為用戶免去面對(duì)海量的數(shù)據(jù)時(shí)頻繁分庫分表的繁瑣操作,同時(shí)支持?jǐn)?shù)據(jù)壓縮,在海量數(shù)據(jù)檢索和寫入性能上進(jìn)行了大量?jī)?yōu)化。
- 秒級(jí)故障恢復(fù)
計(jì)算節(jié)點(diǎn)實(shí)現(xiàn)了無狀態(tài),支持秒級(jí)的故障切換和恢復(fù),即便計(jì)算節(jié)點(diǎn)所在的物理機(jī)宕機(jī)也可以在一分鐘之內(nèi)恢復(fù)。
- 數(shù)據(jù)高可靠
集群支持安全組和 VPC
網(wǎng)絡(luò)隔離。自動(dòng)維護(hù)數(shù)據(jù)和備份的多個(gè)副本,保障數(shù)據(jù)安全可靠,可靠性達(dá)99.9999999%。
- 彈性擴(kuò)展
計(jì)算節(jié)點(diǎn)可根據(jù)業(yè)務(wù)需要快速升降配,秒級(jí)完成擴(kuò)容,結(jié)合彈性存儲(chǔ),實(shí)現(xiàn)計(jì)算資源的成本最優(yōu)。
- 快速只讀擴(kuò)展
計(jì)算節(jié)點(diǎn)可根據(jù)業(yè)務(wù)需要快速添加只讀節(jié)點(diǎn),一個(gè)集群支持秒級(jí)添加或刪除1個(gè) - 15個(gè)只讀節(jié)點(diǎn),快速應(yīng)對(duì)業(yè)務(wù)峰值和變化場(chǎng)景。
- 快照備份回檔
基于數(shù)據(jù)多版本的秒級(jí)快照備份對(duì)用戶的數(shù)據(jù)進(jìn)行連續(xù)備份保護(hù),免去主從架構(gòu)備份回檔數(shù)據(jù)的同步和搬遷,最高以GB/秒的速度極速并行回檔,保證業(yè)務(wù)數(shù)據(jù)迅速恢復(fù)。
- Serverless 架構(gòu)
Serverless
是騰訊自研云原生數(shù)據(jù)庫 TDSQL-C MySQL
版的無服務(wù)器架構(gòu)版,自動(dòng)擴(kuò)縮容,僅按照實(shí)際使用量計(jì)費(fèi),不用不計(jì)費(fèi),輕松應(yīng)對(duì)業(yè)務(wù)數(shù)據(jù)量動(dòng)態(tài)變化和持續(xù)增長(zhǎng)。
三、TDSQL-C的應(yīng)用場(chǎng)景
TDSQL-C MySQL
版廣泛適用于多個(gè)行業(yè)和應(yīng)用場(chǎng)景,具備以下條件和優(yōu)勢(shì):
-
互聯(lián)網(wǎng)移動(dòng)應(yīng)用:
- 提供商用數(shù)據(jù)庫級(jí)別的高性能和高可靠性,保證業(yè)務(wù)的平穩(wěn)高效運(yùn)行。
- 解決了傳統(tǒng)主備架構(gòu)在彈性能力、同步效率和主備切換時(shí)間等方面的問題,保證系統(tǒng)的高可用性和業(yè)務(wù)的連續(xù)性。
- 全面兼容開源數(shù)據(jù)庫
MySQL
,無需更改現(xiàn)有業(yè)務(wù)應(yīng)用即可接入TDSQL-C MySQL
版,助力企業(yè)平滑上云。
-
游戲應(yīng)用:
- 提供敏捷靈活的彈性擴(kuò)展,根據(jù)業(yè)務(wù)需求快速升降級(jí)和擴(kuò)容,應(yīng)對(duì)業(yè)務(wù)峰值。
- 支持
PB
級(jí)的海量存儲(chǔ),按存儲(chǔ)量計(jì)費(fèi),自動(dòng)擴(kuò)容,減少了合區(qū)合服的繁瑣操作,實(shí)現(xiàn)資源和成本的最優(yōu)配置。 - 提供秒級(jí)的快照備份和快速回檔能力,對(duì)用戶數(shù)據(jù)進(jìn)行連續(xù)保護(hù)。
-
電商、直播、教育行業(yè):
- 支持秒級(jí)的升配,最多可擴(kuò)展至15個(gè)節(jié)點(diǎn),快速增加
QPS
的能力,解決了傳統(tǒng)數(shù)據(jù)庫升配時(shí)間隨存儲(chǔ)量和宿主機(jī)資源增加而上升的問題。 - 提供優(yōu)化的
IOPS
能力,保證在高并發(fā)狀態(tài)下的出色數(shù)據(jù)寫入能力,適應(yīng)業(yè)務(wù)峰值需求。 - 通過物理復(fù)制方式連接讀寫節(jié)點(diǎn)和只讀節(jié)點(diǎn),大大降低了只讀節(jié)點(diǎn)與讀寫節(jié)點(diǎn)之間的延遲,滿足電商場(chǎng)景中買家和賣家數(shù)據(jù)的一致性讀取需求。
- 支持秒級(jí)的升配,最多可擴(kuò)展至15個(gè)節(jié)點(diǎn),快速增加
-
金融、保險(xiǎn)企業(yè):
- 采用多可用區(qū)架構(gòu),在多個(gè)可用區(qū)備份數(shù)據(jù),提供容災(zāi)和備份功能。
- 提供全方位的安全保障措施,如白名單、VPC網(wǎng)絡(luò)等,保護(hù)數(shù)據(jù)庫數(shù)據(jù)的訪問、存儲(chǔ)和管理。
- 通過共享分布式存儲(chǔ)設(shè)計(jì),徹底解決了主從異步復(fù)制帶來的備庫數(shù)據(jù)非強(qiáng)一致性問題。
這些條件和優(yōu)勢(shì)使TDSQL-C MySQL
版適用于各種業(yè)務(wù)場(chǎng)景,包括高頻交易、快速增長(zhǎng)業(yè)務(wù)、大數(shù)據(jù)量低頻查詢、金融數(shù)據(jù)安全、開發(fā)測(cè)試和成本敏感場(chǎng)景。
四、基于TDSQL-C 存儲(chǔ)爬取的QQ音樂歌單數(shù)據(jù)
我這次準(zhǔn)備使用 TDSQL-C Serverless MySQL 快速搭建一個(gè)爬蟲應(yīng)用,這里我們打算使用 Python來實(shí)現(xiàn),來體驗(yàn) 云原生數(shù)據(jù)庫 TDSQL-C 給我們帶來的優(yōu)勢(shì)。
如下為最項(xiàng)目代碼如下:
讓我們開始構(gòu)建吧!!!
1、創(chuàng)建TDSQL-C Serverless數(shù)據(jù)庫
一直下一步購買后就能在TDSQL-C
集群列表中看見
- 為了方便后續(xù)我們開發(fā)程序,我們需要先將數(shù)據(jù)庫的外網(wǎng)訪問打開
2、創(chuàng)建所需數(shù)據(jù)庫并通過DMC進(jìn)行數(shù)據(jù)庫管理
- 通過 DMC 創(chuàng)建數(shù)據(jù)表
CREATE TABLE `cate` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(255) DEFAULT NULL,`type` varchar(255) DEFAULT NULL COMMENT 'kg | kw | wyy | qq',`cate` varchar(255) DEFAULT NULL COMMENT '分類',`primary_key` bigint(255) DEFAULT NULL COMMENT '平臺(tái)主鍵',`create_date` datetime DEFAULT NULL,`update_date` datetime DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `u` (`type`,`primary_key`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;CREATE TABLE `playlist` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(255) DEFAULT NULL COMMENT '標(biāo)題',`desc` longtext COMMENT '描述',`cate` varchar(255) DEFAULT NULL COMMENT '類型',`cate_id` varchar(255) DEFAULT NULL,`is_own` tinyint(255) DEFAULT '1' COMMENT '1 第三方創(chuàng)建的 2自己創(chuàng)建的',`primary_key` varchar(255) DEFAULT NULL COMMENT '第三方歌單主鍵',`key_type` char(10) DEFAULT NULL COMMENT 'qq | kg | wyy | kw ',`thumb_img` longtext COMMENT '封面',`tag` text COMMENT '標(biāo)簽 ,',`tag_id` text COMMENT '標(biāo)簽id ,拆分',`author` varchar(255) DEFAULT NULL COMMENT '作者',`author_id` bigint(255) DEFAULT NULL COMMENT '作者id',`collect_num` bigint(20) DEFAULT '0' COMMENT '收藏?cái)?shù)量',`share_num` bigint(20) DEFAULT '0' COMMENT '分享數(shù)量',`comment_num` bigint(255) DEFAULT '0' COMMENT '評(píng)論數(shù)量',`play_num` bigint(20) DEFAULT '0' COMMENT '歌單播放次數(shù)',`song_num` bigint(20) DEFAULT '0' COMMENT '歌單歌曲數(shù)量',`platform_create_date` datetime DEFAULT NULL COMMENT '第三方歌單創(chuàng)建時(shí)間',`create_date` datetime DEFAULT NULL,`update_date` datetime DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
一個(gè)是分類表,用于存儲(chǔ)歌單的分類信息,然后通過分類去獲取歌單列表
另一個(gè)是歌單表,用于存儲(chǔ)爬取的歌單數(shù)據(jù)
3、構(gòu)建QQ音樂歌單爬蟲
3.1 初始化框架環(huán)境
這里我采用了 feapder
這個(gè)輕量級(jí)框架
- 安裝
feapder
爬蟲框架
pip3 install feapder[all]
- 創(chuàng)建爬蟲項(xiàng)目
feapder create -p QQSpider
- 在
setting.py
中配置TDSQL-C
數(shù)據(jù)庫以及redis
信息
# # MYSQL
MYSQL_IP = "gz-xxxxxx"
MYSQL_PORT = 28671
MYSQL_DB = "questionnaire"
MYSQL_USER_NAME = "root"
MYSQL_USER_PASS = "123456"# # REDIS
# # ip:port 多個(gè)可寫為列表或者逗號(hào)隔開 如 ip1:port1,ip2:port2 或 ["ip1:port1", "ip2:port2"]
REDISDB_IP_PORTS = "x"
REDISDB_USER_PASS = "x"
REDISDB_DB = 7
- 安裝依賴 requirements.txt
feapder~=1.7.7
pycryptodome
Flask~=2.2.2
pillow~=9.2.0
requests-toolbelt
requests~=2.27.1
apscheduler~=3.9.1
js2py~=0.71
urllib3~=1.26.11
pytz~=2022.1
gevent~=21.12.0
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
為了方便可以把這個(gè) shell
寫在項(xiàng)目的根目錄
3.2 在spiders下創(chuàng)建分類爬蟲
- category.py
import feapder
import urllib.parsefrom feapder import Requestfrom items.cateItem import CateItemclass CategorySpider(feapder.Spider):commonParams = {'g_tk': 1124214810,'loginUin': '0','hostUin': 0,'inCharset': 'utf8','outCharset': 'utf-8','notice': 0,'platform': 'yqq.json','needNewCode': 0,}apiHeader = {'referer': 'https://c.y.qq.com/','host': 'c.y.qq.com'}domain = 'https://c.y.qq.com'def start_requests(self):url = "/splcloud/fcgi-bin/fcg_get_diss_tag_conf.fcg?" + self.getParams({'format': 'json','outCharset': 'utf-8',})yield self.request(url, method="GET")def request(self, path, **kwargs):req = Request(self.domain + path, **kwargs)return self.downloadMidware(req)def downloadMidware(self, request):if request.url.startswith('https://y.qq.com/n/ryqq/playlist'):return requestrequest.headers = self.apiHeaderreturn requestdef getParams(self, params):data = paramsdata.update(self.commonParams)return urllib.parse.urlencode(data)def validate(self, request, response):jsonData = response.jsonif jsonData['code'] != 0:raise Exception(jsonData['message'])return Truedef parse(self, request, response):jsonData = response.jsonfor cate in jsonData['data']['categories']:cateName = cate['categoryGroupName']for item in cate['items']:cateItem = CateItem()cateItem.primary_key = item['categoryId']cateItem.title = item['categoryName']cateItem.type = "qq"cateItem.cate = cateNameyield cateItemif __name__ == "__main__":CategorySpider(redis_key="qq_category:spider").start()
這里我們還要配置一下 ORM
,在itmes
目錄下創(chuàng)建 cateItem
,用于映射數(shù)據(jù)庫表,方便直接入庫,不用編寫原生SQL
- items/cateItem.py
from feapder import Item
from feapder.utils import toolsclass CateItem(Item):"""This class was generated by feapder.command: feapder create -i spider_data."""__unique_key__ = ["title", "cate", "type", 'primary_key'] # 指定去重的key為 title、url,最后的指紋為title與url值聯(lián)合計(jì)算的md5def __init__(self, *args, **kwargs):# self.id = Nonesuper().__init__(**kwargs)self.table_name = "cate"self.title = Noneself.cate = Noneself.primary_key = Noneself.type = Noneself.create_date = Noneself.update_date = Nonedef pre_to_db(self):"""入庫前的處理"""self.create_date = tools.format_time("剛剛")self.update_date = tools.format_time("剛剛")
- 運(yùn)行測(cè)試爬取分類數(shù)據(jù)
可以看到數(shù)據(jù)已經(jīng)全部入庫了
3.3 在spiders下創(chuàng)建歌單爬蟲
同理,我們先建立一下歌單表的 ORM
- items/playlistItem.py
from feapder import Item
from feapder.utils import toolsclass PlaylistItem(Item):def __init__(self, *args, **kwargs):# self.id = Nonesuper().__init__(**kwargs)self.table_name = "playlist"self.title = Noneself.desc = Noneself.primary_key = Noneself.cate = Noneself.cate_id = Noneself.key_type = Noneself.thumb_img = Noneself.tag = Noneself.tag_id = Noneself.author = Noneself.author_id = Noneself.collect_num = Noneself.share_num = Noneself.comment_num = Noneself.play_num = Noneself.song_num = Noneself.platform_create_date = Noneself.create_date = Noneself.update_date = Nonedef pre_to_db(self):"""入庫前的處理"""self.create_date = tools.format_time("剛剛")self.update_date = tools.format_time("剛剛")
然后創(chuàng)建爬蟲
- spiders/playlist.py
import urllib.parseimport feapder
from feapder import Request
from feapder.db.mysqldb import MysqlDBfrom items.playlistItem import PlaylistItemclass PlayListSpider(feapder.Spider):commonParams = {'g_tk': 1124214810,'loginUin': '0','hostUin': 0,'inCharset': 'utf8','outCharset': 'utf-8','notice': 0,'platform': 'yqq.json','needNewCode': 0,}apiHeader = {'referer': 'https://c.y.qq.com/','host': 'c.y.qq.com'}domain = 'https://c.y.qq.com'def start_requests(self):db = MysqlDB()cateList = db.find(sql="select * from cate where type = 'qq'", to_json=True)for cate in cateList:yield self.getPlaylistByCateId(cate['primary_key'], cate['title'])def getPlaylistByCateId(self, cateId, cateTitle, page=0, limit=50, sortId=5):sin = +page * +limitein = +limit * (+page + 1) - 1params = self.getParams({'format': 'json','outCharset': 'utf-8','picmid': 1,'categoryId': cateId,'sortId': sortId,'sin': sin,'ein': ein,})url = "/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg?" + paramsreturn self.request(url, method="GET", page=page, limit=limit, cateId=cateId, cateTitle=cateTitle)def getParams(self, params):data = paramsdata.update(self.commonParams)return urllib.parse.urlencode(data)# 構(gòu)造請(qǐng)求def request(self, path, **kwargs):req = Request(self.domain + path, **kwargs)return self.downloadMidware(req)# 構(gòu)造請(qǐng)求頭def downloadMidware(self, request):if request.url.startswith('https://y.qq.com/n/ryqq/playlist'):return requestrequest.headers = self.apiHeaderreturn requestdef validate(self, request, response):jsonData = response.jsonif jsonData['code'] != 0:raise Exception(jsonData['message'])return Truedef parse(self, request, response):jsonData = response.jsonplaylist = jsonData['data']['list']for item in playlist:playlist = PlaylistItem()playlist.title = item.get('dissname')playlist.thumb_img = item.get('imgurl')playlist.create_date = item.get('createtime')playlist.primary_key = item.get('dissid')playlist.desc = item.get('introduction')playlist.play_num = item.get('listennum')playlist.cate = request.cateTitleyield playlist# 分頁處理if len(playlist) != 0:yield self.getPlaylistByCateId(request.cateId, request.cateTitle, request.page + 1, request.limit)# 通過分類id獲取歌單列表if __name__ == "__main__":PlayListSpider(redis_key="qq_playlist:spider").start()
運(yùn)行爬蟲后可以看到數(shù)據(jù)庫的吞吐率很高,一會(huì)就有幾千條數(shù)據(jù)了
4、進(jìn)行數(shù)據(jù)庫狀態(tài)觀察
在爬取的過程中,我一直擔(dān)心數(shù)據(jù)庫會(huì)成為應(yīng)用的瓶頸,沒想到最低配的 TDSQL-C 性能也是異常的強(qiáng)悍,期間通過自帶的監(jiān)控告警,也是很方便觀察到秒級(jí)性能波動(dòng)
然后 TDSQL-C
旁邊還有個(gè) 數(shù)據(jù)庫智能管家
,這是一個(gè)非常利于我們?cè)诰€運(yùn)維的工具,他可以看到當(dāng)前實(shí)例的:異常、性能趨勢(shì)、實(shí)時(shí)會(huì)話、慢SQL分析、SQL優(yōu)化、審計(jì)日志等等
他還可以為我們根據(jù)時(shí)間區(qū)間創(chuàng)建健康報(bào)告,讓我們清晰地了解到數(shù)據(jù)庫實(shí)例的健康狀態(tài),針對(duì)重要項(xiàng)目,我們可以設(shè)置定期報(bào)告,然后通過郵箱接收?qǐng)?bào)告內(nèi)容,從而減輕我們的運(yùn)維負(fù)擔(dān)
總結(jié)
本次案例主要讓大家對(duì)云原生數(shù)據(jù)庫 TDSQL-C Serverless
有一個(gè)基本的認(rèn)識(shí),可以看到 TDSQL-C Serverless
與平時(shí)所使用的 Sql
語法差不多一致,基本上沒有什么學(xué)習(xí)成本,開箱即用,可以快速上手,真正的無縫接入, 異常的絲滑!!
針對(duì)本次體驗(yàn),我也總結(jié)了一些優(yōu)點(diǎn)與遇到的一些問題,希望分享給大家,能給大家?guī)硪恍┘夹g(shù)選型建議:
- 其中優(yōu)點(diǎn)有:
- 其中在
TDSQL-C
的特點(diǎn)中:高性能、海量存儲(chǔ)、完全兼容Mysql、快照備份等都能夠非常直接感受到,確實(shí)如描述所說,屬于名副其實(shí)了,這個(gè)我也不過多贅述。 - 通過對(duì)傳統(tǒng)數(shù)據(jù)庫的了解,實(shí)際上對(duì)于采用 ServerLess 架構(gòu)的數(shù)據(jù)庫,是對(duì)中小公司的更好選擇,通過靈活的計(jì)費(fèi)模式,按量付費(fèi)不需要承擔(dān)過多的人力成本、運(yùn)維成本就可以獲得一個(gè)高可用、高性能基礎(chǔ)設(shè)施,從而實(shí)現(xiàn)降本增效
TDSQL-C
還可以非常簡(jiǎn)單面對(duì)各種大流量場(chǎng)景,其中有一個(gè)非常簡(jiǎn)單易用的功能就輸數(shù)據(jù)庫的流量負(fù)載均衡,通過設(shè)置RO
組只讀實(shí)例的集合,然后通過權(quán)重進(jìn)行流量負(fù)載均衡,相應(yīng)的讀請(qǐng)求按一定規(guī)則發(fā)送到只讀實(shí)例,能夠顯著提高數(shù)據(jù)庫的讀負(fù)載能力。- 在產(chǎn)品上比較完備,感覺很細(xì)節(jié),在提供數(shù)據(jù)庫的同時(shí)也提供了數(shù)據(jù)庫的可視化管理,不用再去下載數(shù)據(jù)庫管理客戶端就可以實(shí)現(xiàn)庫表級(jí)操作、實(shí)時(shí)監(jiān)控、實(shí)例會(huì)話管理、
SQL
窗口等操作;同時(shí)也有智能監(jiān)控、健康管理分析等輔助工具,非常適合我這種懶人。
- 遇到的一些小問題:
- 將這個(gè)程序部署到騰訊云服務(wù)器的時(shí)候,發(fā)現(xiàn)使用內(nèi)網(wǎng)地址連接不了這個(gè) TDSQL-C 數(shù)據(jù)庫,但是公網(wǎng)沒問題,可是想著內(nèi)網(wǎng)可以有更高的效率,于是一直排查,最后也是從文檔上發(fā)現(xiàn),原來輕量型不能直接通過內(nèi)網(wǎng)地址連接 TDSQL-C MySQL 版進(jìn)行訪問,使用 云聯(lián)網(wǎng) 互通
- 期間在對(duì)數(shù)據(jù)庫進(jìn)行壓力測(cè)試的時(shí)候,出現(xiàn)
Too many connections
,后續(xù)排查發(fā)現(xiàn)是因?yàn)閿?shù)據(jù)庫默認(rèn)連接數(shù)是80
后面將這個(gè)默認(rèn)值改大之后就再也沒出現(xiàn)過了:
參考文獻(xiàn)
騰訊云TDSQL-C官方文檔
feapder框架