【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据
【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据
文章目录
- 【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据
- 前言
- 出现的背景
- 一、TDSQL-C数据库是什么?
- 二、TDSQL-C 的特点
- 三、TDSQL-C的应用场景
- 四、基于TDSQL-C 存储爬取的QQ音乐歌单数据
- 1、创建TDSQL-C Serverless数据库
- 2、创建所需数据库并通过DMC进行数据库管理
- 3、构建QQ音乐歌单爬虫
- 3.1 初始化框架环境
- 3.2 在spiders下创建分类爬虫
- 3.3 在spiders下创建歌单爬虫
- 4、进行数据库状态观察
- 总结
- 参考文献
前言
最近有幸参与了腾讯云举办的 腾讯云 TDSQL-C
产品体验活动。在这个过程中,通过了解 TDSQL-C
的产品和实践,让我受益非浅,原来数据库还能这么玩! 也让我真正体会到了降本增效这个词的意义。
在看到活动的介绍和微信群的讲解后,我马不停蹄地开始了自己摸索。首先是跟着群里小助手发的实验手册,体验了一下整个产品的业务流程。
随后又查看官方的产品文档,文档非常的简洁明了,然后根据这些资料开始了我的第一个 TDSQL-C
程序,基于 TDSQL-C
数据库构建了一个基于 Vue
的问卷调查系统,亲身体验了 TDSQL-C
带来的高性能、弹性可靠服务,整个过程十分丝滑。
下面就来整理,分享一下我的操作和感悟,希望能够帮助到其他同学。
出现的背景
传统数据库为什么被云数据库替代?
关于 TDSQL-C
的出现,我觉得需要先从云数据库开始了解,传统的本地数据库部署需要企业自己购买、维护硬件设备和管理数据库软件,这对于资源有限的中小企业来说可能是一项昂贵和繁琐的任务。同时,传统数据库在面对大规模的数据处理和高并发访问时可能会遇到性能瓶颈和可用性问题。云数据库的出现解决了这些问题。它将数据库部署在云平台上,并提供弹性的计算和存储资源,使用户能够根据实际需求按需扩展数据库的容量和性能。云数据库还提供高可用性和可靠性,通过数据备份、冗余存储和容灾机制来保护数据的安全和可恢复性。此外,云数据库还提供了便捷的管理和监控工具,简化了数据库的操作和维护过程。
serverless数据库带来了什么好处?
而云 Serverless
数据库的出现则是为了进一步提供更高的灵活性和经济效益。传统的数据库需要预先配置和维护一定数量的计算资源,而这些资源在闲置时仍然需要付费。而 Serverless
数据库采用按需付费的模式,它根据实际的计算和存储资源使用量来计费,无需预先配置资源。这使得用户可以根据实际需求动态地扩展和缩减数据库的资源,避免了资源浪费和额外的成本支出。Serverless
数据库还可以自动管理和优化资源,用户只需专注于应用开发,而无需关注底层基础设施的管理。
而 TDSQL-C
是腾讯云自研的新一代云原生关系型数据库。融合了传统数据库、云计算与新硬件技术的优势,100%兼容 MySQL
,为用户提供极致弹性、高性能、高可用、高可靠、安全的数据库服务。实现超百万 QPS
的高吞吐、PB
级海量分布式智能存储、Serverless
秒级伸缩,助力企业加速完成数字化转型。
Serverless 服务是腾讯云自研的新一代云原生关系型数据库 TDSQL-C MySQL
版的无服务器架构版,是全 Serverless
架构的云原生数据库。Serverless
服务支持按实际计算和存储资源使用量收取费用,不用不付费,将腾讯云云原生技术普惠用户。
总的来说,云数据库和云 Serverless 数据库的产生是为了满足不同规模和需求的用户对于数据存储和处理的需求,并提供更灵活、可扩展和经济高效的解决方案。
一、TDSQL-C数据库是什么?
TDSQL-C MySQL
版基于 Cloud Native
设计理念,既融合了商业数据库稳定可靠、高性能、可扩展的特征,又具有开源云数据库简单开放、高效迭代的优势。
我们来理解一下这段描述, Cloud Native
设计理念是什么?
Cloud Native 设计理念是一种在云计算环境下进行应用开发和部署的方法论和思维方式,目标是将应用程序和基础设施解耦,使得应用程序能够更好地适应云环境的动态性和弹性,并提供更好的可伸缩性、可靠性和可管理性。它能够帮助开发者更快速、高效地构建和交付应用程序,并更好地应对日益复杂和变化的业务需求。
基于这个设计方式,所以 TDSQL-C MySQL
版可以为为用户提供具备超高弹性、高性能、海量存储、安全可靠的数据库服务,以可帮助企业轻松应对诸如商品订单等高频交易、伴随流量洪峰的快速增长业务、游戏业务、历史订单等大数据量低频查询、金融数据安全相关、开发测试、成本敏感等的业务场景。
二、TDSQL-C 的特点
我找到了一些关于我们在选择底层组件时候需要关注的一些特点,凭什么 TDSQL-C
值得我们选择呢?
- 完全兼容
TDSQL-C MySQL
版将开源数据库的计算和存储分离,存储构建在腾讯云分布式云存储服务之上,计算层全面兼容开源数据库引擎 MySQL 5.7、8.0
,业务无需改造即可平滑迁移。
- 超高性能
单节点百万 QPS
的超高性能,可以满足高并发高性能的场景,保证关键业务的连续性,并可进一步提供读写分离以及读写扩展性。
- 海量存储
最高支持 PB 级的海量存储,为用户免去面对海量的数据时频繁分库分表的繁琐操作,同时支持数据压缩,在海量数据检索和写入性能上进行了大量优化。
- 秒级故障恢复
计算节点实现了无状态,支持秒级的故障切换和恢复,即便计算节点所在的物理机宕机也可以在一分钟之内恢复。
- 数据高可靠
集群支持安全组和 VPC
网络隔离。自动维护数据和备份的多个副本,保障数据安全可靠,可靠性达99.9999999%。
- 弹性扩展
计算节点可根据业务需要快速升降配,秒级完成扩容,结合弹性存储,实现计算资源的成本最优。
- 快速只读扩展
计算节点可根据业务需要快速添加只读节点,一个集群支持秒级添加或删除1个 - 15个只读节点,快速应对业务峰值和变化场景。
- 快照备份回档
基于数据多版本的秒级快照备份对用户的数据进行连续备份保护,免去主从架构备份回档数据的同步和搬迁,最高以GB/秒的速度极速并行回档,保证业务数据迅速恢复。
- Serverless 架构
Serverless
是腾讯自研云原生数据库 TDSQL-C MySQL
版的无服务器架构版,自动扩缩容,仅按照实际使用量计费,不用不计费,轻松应对业务数据量动态变化和持续增长。
三、TDSQL-C的应用场景
TDSQL-C MySQL
版广泛适用于多个行业和应用场景,具备以下条件和优势:
-
互联网移动应用:
- 提供商用数据库级别的高性能和高可靠性,保证业务的平稳高效运行。
- 解决了传统主备架构在弹性能力、同步效率和主备切换时间等方面的问题,保证系统的高可用性和业务的连续性。
- 全面兼容开源数据库
MySQL
,无需更改现有业务应用即可接入TDSQL-C MySQL
版,助力企业平滑上云。
-
游戏应用:
- 提供敏捷灵活的弹性扩展,根据业务需求快速升降级和扩容,应对业务峰值。
- 支持
PB
级的海量存储,按存储量计费,自动扩容,减少了合区合服的繁琐操作,实现资源和成本的最优配置。 - 提供秒级的快照备份和快速回档能力,对用户数据进行连续保护。
-
电商、直播、教育行业:
- 支持秒级的升配,最多可扩展至15个节点,快速增加
QPS
的能力,解决了传统数据库升配时间随存储量和宿主机资源增加而上升的问题。 - 提供优化的
IOPS
能力,保证在高并发状态下的出色数据写入能力,适应业务峰值需求。 - 通过物理复制方式连接读写节点和只读节点,大大降低了只读节点与读写节点之间的延迟,满足电商场景中买家和卖家数据的一致性读取需求。
- 支持秒级的升配,最多可扩展至15个节点,快速增加
-
金融、保险企业:
- 采用多可用区架构,在多个可用区备份数据,提供容灾和备份功能。
- 提供全方位的安全保障措施,如白名单、VPC网络等,保护数据库数据的访问、存储和管理。
- 通过共享分布式存储设计,彻底解决了主从异步复制带来的备库数据非强一致性问题。
这些条件和优势使TDSQL-C MySQL
版适用于各种业务场景,包括高频交易、快速增长业务、大数据量低频查询、金融数据安全、开发测试和成本敏感场景。
四、基于TDSQL-C 存储爬取的QQ音乐歌单数据
我这次准备使用 TDSQL-C Serverless MySQL 快速搭建一个爬虫应用,这里我们打算使用 Python来实现,来体验 云原生数据库 TDSQL-C 给我们带来的优势。
如下为最项目代码如下:
让我们开始构建吧!!!
1、创建TDSQL-C Serverless数据库
一直下一步购买后就能在TDSQL-C
集群列表中看见
- 为了方便后续我们开发程序,我们需要先将数据库的外网访问打开
2、创建所需数据库并通过DMC进行数据库管理
- 通过 DMC 创建数据表
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 '平台主键',`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 '标题',`desc` longtext COMMENT '描述',`cate` varchar(255) DEFAULT NULL COMMENT '类型',`cate_id` varchar(255) DEFAULT NULL,`is_own` tinyint(255) DEFAULT '1' COMMENT '1 第三方创建的 2自己创建的',`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 '标签 ,',`tag_id` text COMMENT '标签id ,拆分',`author` varchar(255) DEFAULT NULL COMMENT '作者',`author_id` bigint(255) DEFAULT NULL COMMENT '作者id',`collect_num` bigint(20) DEFAULT '0' COMMENT '收藏数量',`share_num` bigint(20) DEFAULT '0' COMMENT '分享数量',`comment_num` bigint(255) DEFAULT '0' COMMENT '评论数量',`play_num` bigint(20) DEFAULT '0' COMMENT '歌单播放次数',`song_num` bigint(20) DEFAULT '0' COMMENT '歌单歌曲数量',`platform_create_date` datetime DEFAULT NULL COMMENT '第三方歌单创建时间',`create_date` datetime DEFAULT NULL,`update_date` datetime DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
一个是分类表,用于存储歌单的分类信息,然后通过分类去获取歌单列表
另一个是歌单表,用于存储爬取的歌单数据
3、构建QQ音乐歌单爬虫
3.1 初始化框架环境
这里我采用了 feapder
这个轻量级框架
- 安装
feapder
爬虫框架
pip3 install feapder[all]
- 创建爬虫项目
feapder create -p QQSpider
- 在
setting.py
中配置TDSQL-C
数据库以及redis
信息
# # MYSQL
MYSQL_IP = "gz-xxxxxx"
MYSQL_PORT = 28671
MYSQL_DB = "questionnaire"
MYSQL_USER_NAME = "root"
MYSQL_USER_PASS = "123456"# # REDIS
# # ip:port 多个可写为列表或者逗号隔开 如 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
为了方便可以把这个 shell
写在项目的根目录
3.2 在spiders下创建分类爬虫
- 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
目录下创建 cateItem
,用于映射数据库表,方便直接入库,不用编写原生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值联合计算的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("刚刚")
- 运行测试爬取分类数据
可以看到数据已经全部入库了
3.3 在spiders下创建歌单爬虫
同理,我们先建立一下歌单表的 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("刚刚")
然后创建爬虫
- 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)# 构造请求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 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()
运行爬虫后可以看到数据库的吞吐率很高,一会就有几千条数据了
4、进行数据库状态观察
在爬取的过程中,我一直担心数据库会成为应用的瓶颈,没想到最低配的 TDSQL-C 性能也是异常的强悍,期间通过自带的监控告警,也是很方便观察到秒级性能波动
然后 TDSQL-C
旁边还有个 数据库智能管家
,这是一个非常利于我们在线运维的工具,他可以看到当前实例的:异常、性能趋势、实时会话、慢SQL分析、SQL优化、审计日志等等
他还可以为我们根据时间区间创建健康报告,让我们清晰地了解到数据库实例的健康状态,针对重要项目,我们可以设置定期报告,然后通过邮箱接收报告内容,从而减轻我们的运维负担
总结
本次案例主要让大家对云原生数据库 TDSQL-C Serverless
有一个基本的认识,可以看到 TDSQL-C Serverless
与平时所使用的 Sql
语法差不多一致,基本上没有什么学习成本,开箱即用,可以快速上手,真正的无缝接入, 异常的丝滑!!
针对本次体验,我也总结了一些优点与遇到的一些问题,希望分享给大家,能给大家带来一些技术选型建议:
- 其中优点有:
- 其中在
TDSQL-C
的特点中:高性能、海量存储、完全兼容Mysql、快照备份等都能够非常直接感受到,确实如描述所说,属于名副其实了,这个我也不过多赘述。 - 通过对传统数据库的了解,实际上对于采用 ServerLess 架构的数据库,是对中小公司的更好选择,通过灵活的计费模式,按量付费不需要承担过多的人力成本、运维成本就可以获得一个高可用、高性能基础设施,从而实现降本增效
TDSQL-C
还可以非常简单面对各种大流量场景,其中有一个非常简单易用的功能就输数据库的流量负载均衡,通过设置RO
组只读实例的集合,然后通过权重进行流量负载均衡,相应的读请求按一定规则发送到只读实例,能够显著提高数据库的读负载能力。- 在产品上比较完备,感觉很细节,在提供数据库的同时也提供了数据库的可视化管理,不用再去下载数据库管理客户端就可以实现库表级操作、实时监控、实例会话管理、
SQL
窗口等操作;同时也有智能监控、健康管理分析等辅助工具,非常适合我这种懒人。
- 遇到的一些小问题:
- 将这个程序部署到腾讯云服务器的时候,发现使用内网地址连接不了这个 TDSQL-C 数据库,但是公网没问题,可是想着内网可以有更高的效率,于是一直排查,最后也是从文档上发现,原来轻量型不能直接通过内网地址连接 TDSQL-C MySQL 版进行访问,使用 云联网 互通
- 期间在对数据库进行压力测试的时候,出现
Too many connections
,后续排查发现是因为数据库默认连接数是80
后面将这个默认值改大之后就再也没出现过了:
参考文献
腾讯云TDSQL-C官方文档
feapder框架
相关文章:

【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据
【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据 文章目录 【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据前言出现的背景一、TDSQL-C数据库是什么?二、TDSQL-C 的特点三、TDSQL-C的应用场景四、基于TD…...
leetcode 6450. k-avoiding 数组的最小总和
给你两个整数 n 和 k 。 对于一个由 不同 正整数组成的数组,如果其中不存在任何求和等于 k 的不同元素对,则称其为 k-avoiding 数组。 返回长度为 n 的 k-avoiding 数组的可能的最小总和。 示例 1: 输入:n 5, k 4 输出&#…...

变压器绝缘油耐压试验
试验目的 绝缘油是电气设备常用的绝缘、 灭弧和冷却介质。 为保证它在运行过程中具有良好的性能, 必须定期对其进行各项试验, 尤其是耐压试验。 绝缘油的耐压试验是在专用的击穿电压试验器中进行的, 试验器包括一个瓷质或玻璃油杯、 两个直径…...
Windows控制台API官方文档
2023年8月21日,周下午 中文文档:控制台函数 - Windows Console | Microsoft Learn 英文文档:Console Functions - Windows Console | Microsoft Learn...

PyTorch DataLoader 报错 “DataLoader worker exited unexpectedly“ 的解决方案
注意:博主没有重写d2l的源代码文件,而是创建了一个新的python文件,并重写了该方法。 一、代码运行日志 C:\Users\Administrator\anaconda3\envs\limu\python.exe G:/PyCharmProjects/limu-d2l/ch03/softmax_regression.py Traceback (most r…...

【AI绘画--七夕篇】:七夕特别教程,使用SDXL绘制你的心上人(Stable Diffusion)(封神榜—妲己)
目录 前言0、介绍0-0、结果展示0-1、Stable Diffusion0-2、sdxl介绍 一、云端部署Stable Diffusion1-1、云端平台的优势 二、平台介绍三、注册账号并且开始炼制3-1、购买算力并创建工作空间3-2、启动工作空间3-3、应用市场一键安装3-4、使用Stable-Diffusion作图 四、有女朋友的…...
hadoop2的集群数据将副本存储在hadoop3
在 Hadoop 集群中,HDFS 副本是分布式存储的,会存储在不同的节点上。因此,如果您的 HDFS 所在路径是在 Hadoop2 集群中,您可以在 Hadoop3 集群上添加新的节点,并向 Hadoop3 集群中添加这些新节点上的数据副本。 以下是…...
c# ??=
空合并运算符 ??,用于定义引用类型和可空类型的默认值。如果此运算符的左操作符不为Null,则此操作符返回左操作数,否则返回右操作数。 例如: //当a不为空时返回a,为null时返回b var c a ?? b;空合并赋值运算符??…...

存储系统性能优化中IOMMU的作用是什么?
一、IOMMU原理 IOMMU(Input/Output Memory Management Unit)是一种用于管理计算机内存的技术,它允许将物理内存映射到虚拟地址空间。IOMMU通过使用专用的硬件来管理和优化内存访问,从而提高系统性能和稳定性。本文将详细介绍IOMMU的原理,并介绍一些应用案例和典型的问题解…...

localhost:8080 is already in use
报错原因:本机的8080端口号已经被占用。因为机器的空闲端口号是随机分配的,而idea默认启动的端口号是8080,所以是存在这种情况。 对于这个问题,我们只需要重启idea或者修改项目的启动端口号即可。 更推荐第二种。对于修改项目启动端口号&…...
机器学习深度学习——NLP实战(自然语言推断——数据集)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——NLP实战(情感分析模型——textCNN实现) 📚订阅专栏:机器…...

攻防世界-simple_php
原题 解题思路 flag被分成了两个部分:flag2,flag2。获得flag1需要满足变量a0且变量a≠0,这看起来不能实现,但实际上当变量a的值是字符时,与数字比较会发生强制类型转换,所以a为字符型数据即可,变…...
2023MyBatis 八股文——面试题
MyBatis简介 1. MyBatis是什么? MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及 获取结果集。MyBa…...

解决出海痛点:亚马逊云科技助力智能涂鸦,实现设备互联互通
今年6月,《财富》(中文版)发布“2023年值得关注的中国出海主力”盘点,在七个赛道中聚焦不断开拓新领域、影响力与日俱增的出海企业。涂鸦智能顺利入选,作为一家全球化公司,相比于产品直接到海外销售的传统出…...

国际刑警组织逮捕 14 名涉嫌盗窃 4000 万美元的网络罪犯
Bleeping Computer 网站披露,4 月份,国际刑警组织发动了一起为期四个月,横跨 25 个非洲国家的执法行动 “Africa Cyber Surge II”,共逮捕 14 名网络犯罪嫌疑人,摧毁 20000 多个从事勒索、网络钓鱼、BEC 和在线诈骗的犯…...

MySQL卸载-Linux版
MySQL卸载-Linux版 停止MySQL服务 systemctl stop mysqld 查询MySQL的安装文件 rpm -qa | grep -i mysql 卸载上述查询出来的所有的MySQL安装包 rpm -e mysql-community-client-plugins-8.0.26-1.el7.x86_64 --nodeps rpm -e mysql-community-server-8.0.26-1.el7.x86_64 -…...

快速学会创建uni-app项目并了解pages.json文件
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 前言 创建 uni-app 项目 通过 HBuilderX 创建 pages.json pages style globalStyle tabBar 前言…...
选云服务器还是物理服务器
选云服务器还是物理服务器 一、为什么需要云服务器或独立服务器取代共享主机 在最早之前,大多数的网站都是共享主机开始的,这里也包含了云虚拟机。这一类的站点还有其他站点都会共同托管在同一台服务器上。但是这种共享机只适用于小的网站,如…...

最新ChatGPT网站AI系统源码+详细图文搭建教程/支持GPT4.0/AI绘画/H5端/Prompt知识库/
一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧!…...

Web3 游戏七月洞察:迈向主流采用的临界点?
作者: lesleyfootprint.network 2023 年 7 月,Web3 游戏领域出现了小幅增长,但对于许多项目来说,用户采用仍然是一个持续的挑战。根据 Footprint Analytics 的数据,活跃的区块链游戏数量略有增加,达到 2,471 个。然而…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...

RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...