【腾讯云 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 值得我们选择呢?

  1. 完全兼容

TDSQL-C MySQL 版将开源数据库的计算和存储分离,存储构建在腾讯云分布式云存储服务之上,计算层全面兼容开源数据库引擎 MySQL 5.7、8.0,业务无需改造即可平滑迁移。

  1. 超高性能

单节点百万 QPS 的超高性能,可以满足高并发高性能的场景,保证关键业务的连续性,并可进一步提供读写分离以及读写扩展性。

  1. 海量存储

最高支持 PB 级的海量存储,为用户免去面对海量的数据时频繁分库分表的繁琐操作,同时支持数据压缩,在海量数据检索和写入性能上进行了大量优化。

  1. 秒级故障恢复

计算节点实现了无状态,支持秒级的故障切换和恢复,即便计算节点所在的物理机宕机也可以在一分钟之内恢复。

  1. 数据高可靠

集群支持安全组和 VPC 网络隔离。自动维护数据和备份的多个副本,保障数据安全可靠,可靠性达99.9999999%。

  1. 弹性扩展

计算节点可根据业务需要快速升降配,秒级完成扩容,结合弹性存储,实现计算资源的成本最优。

  1. 快速只读扩展

计算节点可根据业务需要快速添加只读节点,一个集群支持秒级添加或删除1个 - 15个只读节点,快速应对业务峰值和变化场景。

  1. 快照备份回档

基于数据多版本的秒级快照备份对用户的数据进行连续备份保护,免去主从架构备份回档数据的同步和搬迁,最高以GB/秒的速度极速并行回档,保证业务数据迅速恢复。

  1. Serverless 架构

Serverless 是腾讯自研云原生数据库 TDSQL-C MySQL 版的无服务器架构版,自动扩缩容,仅按照实际使用量计费,不用不计费,轻松应对业务数据量动态变化和持续增长。

三、TDSQL-C的应用场景

TDSQL-C MySQL版广泛适用于多个行业和应用场景,具备以下条件和优势:

  1. 互联网移动应用:

    • 提供商用数据库级别的高性能和高可靠性,保证业务的平稳高效运行。
    • 解决了传统主备架构在弹性能力、同步效率和主备切换时间等方面的问题,保证系统的高可用性和业务的连续性。
    • 全面兼容开源数据库MySQL,无需更改现有业务应用即可接入TDSQL-C MySQL版,助力企业平滑上云。
  2. 游戏应用:

    • 提供敏捷灵活的弹性扩展,根据业务需求快速升降级和扩容,应对业务峰值。
    • 支持PB级的海量存储,按存储量计费,自动扩容,减少了合区合服的繁琐操作,实现资源和成本的最优配置。
    • 提供秒级的快照备份和快速回档能力,对用户数据进行连续保护。
  3. 电商、直播、教育行业:

    • 支持秒级的升配,最多可扩展至15个节点,快速增加QPS的能力,解决了传统数据库升配时间随存储量和宿主机资源增加而上升的问题。
    • 提供优化的IOPS能力,保证在高并发状态下的出色数据写入能力,适应业务峰值需求。
    • 通过物理复制方式连接读写节点和只读节点,大大降低了只读节点与读写节点之间的延迟,满足电商场景中买家和卖家数据的一致性读取需求。
  4. 金融、保险企业:

    • 采用多可用区架构,在多个可用区备份数据,提供容灾和备份功能。
    • 提供全方位的安全保障措施,如白名单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.parse

from feapder import Request

from items.cateItem import CateItem


class 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 request
        request.headers = self.apiHeader
        return request
    def getParams(self, params):
        data = params
        data.update(self.commonParams)
        return urllib.parse.urlencode(data)

    def validate(self, request, response):
        jsonData = response.json
        if jsonData['code'] != 0:
            raise Exception(jsonData['message'])
        return True

    def parse(self, request, response):
        jsonData = response.json
        for 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 = cateName
                yield cateItem



if __name__ == "__main__":
    CategorySpider(redis_key="qq_category:spider").start()

这里我们还要配置一下 ORM,在itmes目录下创建 cateItem,用于映射数据库表,方便直接入库,不用编写原生SQL

  • items/cateItem.py
from feapder import Item
from feapder.utils import tools


class 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值联合计算的md5

    def __init__(self, *args, **kwargs):
        # self.id = None
        super().__init__(**kwargs)
        self.table_name = "cate"
        self.title = None
        self.cate = None
        self.primary_key = None
        self.type = None
        self.create_date = None
        self.update_date = None

    def 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 tools


class PlaylistItem(Item):


    def __init__(self, *args, **kwargs):
        # self.id = None
        super().__init__(**kwargs)
        self.table_name = "playlist"
        self.title = None
        self.desc = None
        self.primary_key = None
        self.cate = None
        self.cate_id = None
        self.key_type = None
        self.thumb_img = None
        self.tag = None
        self.tag_id = None
        self.author = None
        self.author_id = None
        self.collect_num = None
        self.share_num = None
        self.comment_num = None
        self.play_num = None
        self.song_num = None
        self.platform_create_date = None
        self.create_date = None
        self.update_date = None

    def pre_to_db(self):
        """
        入库前的处理
        """
        self.create_date = tools.format_time("刚刚")
        self.update_date = tools.format_time("刚刚")

然后创建爬虫

  • spiders/playlist.py
import urllib.parse


import feapder
from feapder import Request
from feapder.db.mysqldb import MysqlDB

from items.playlistItem import PlaylistItem


class 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 * +limit
        ein = +limit * (+page + 1) - 1
        params = 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?" + params
        return self.request(url, method="GET", page=page, limit=limit, cateId=cateId, cateTitle=cateTitle)

    def getParams(self, params):
        data = params
        data.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 request
        request.headers = self.apiHeader
        return request

    def validate(self, request, response):
        jsonData = response.json
        if jsonData['code'] != 0:
            raise Exception(jsonData['message'])
        return True

    def parse(self, request, response):
        jsonData = response.json

        playlist = 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.cateTitle

            yield 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 语法差不多一致,基本上没有什么学习成本,开箱即用,可以快速上手,真正的无缝接入, 异常的丝滑!!

针对本次体验,我也总结了一些优点与遇到的一些问题,希望分享给大家,能给大家带来一些技术选型建议:

  • 其中优点有:
  1. 其中在 TDSQL-C 的特点中:高性能海量存储完全兼容Mysql快照备份等都能够非常直接感受到,确实如描述所说,属于名副其实了,这个我也不过多赘述。
  2. 通过对传统数据库的了解,实际上对于采用 ServerLess 架构的数据库,是对中小公司的更好选择,通过灵活的计费模式,按量付费不需要承担过多的人力成本、运维成本就可以获得一个高可用、高性能基础设施,从而实现降本增效
  3. TDSQL-C 还可以非常简单面对各种大流量场景,其中有一个非常简单易用的功能就输数据库的流量负载均衡,通过设置 RO 组只读实例的集合,然后通过权重进行流量负载均衡,相应的读请求按一定规则发送到只读实例,能够显著提高数据库的读负载能力。
  4. 在产品上比较完备,感觉很细节,在提供数据库的同时也提供了数据库的可视化管理,不用再去下载数据库管理客户端就可以实现库表级操作、实时监控、实例会话管理、SQL 窗口等操作;同时也有智能监控、健康管理分析等辅助工具,非常适合我这种懒人。
  • 遇到的一些小问题:
  1. 将这个程序部署到腾讯云服务器的时候,发现使用内网地址连接不了这个 TDSQL-C 数据库,但是公网没问题,可是想着内网可以有更高的效率,于是一直排查,最后也是从文档上发现,原来轻量型不能直接通过内网地址连接 TDSQL-C MySQL 版进行访问,使用 云联网 互通

在这里插入图片描述

  1. 期间在对数据库进行压力测试的时候,出现 Too many connections,后续排查发现是因为数据库默认连接数是 80

在这里插入图片描述
后面将这个默认值改大之后就再也没出现过了:
在这里插入图片描述

参考文献

腾讯云TDSQL-C官方文档
feapder框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/74405.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

培训报名小程序-用户注册

目录 1 创建数据源2 注册用户3 判断用户是否注册4 完整代码总结 我们的培训报名小程序,用户每次打开时都需要填写个人信息才可以报名,如果用户多次报名课程,每次都需要填写个人信息,比较麻烦。 本篇我们就优化一下功能&#xff0c…

研发工程师玩转Kubernetes——启动、存活和就绪探针

启动(Startup Probe)、存活(Liveness Probe)和就绪探针(Readiness Probe)有其不同的用途和优先级。 优先级和用途 启动探针(Startup Probe)用于Pod内程序告诉kubernetes,其准备工作已经做好。…

【Servlet】(Servlet API HttpServlet 处理请求 HttpServletRequest 打印请求信息 前端给后端传参)

文章目录 Servlet APIHttpServlet处理请求 HttpServletRequest打印请求信息前端给后端传参 Servlet API Servlet中常用的API HttpServlet 实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service destory 服务器终止的时候会调用. //下面的注解把当前类和…

urllib爬虫模块

urllib爬取数据 import urllib.request as request# 定义url url "https://www.baidu.com" #模拟浏览器发起请求获取响应对象 response request.urlopen(url)""" read方法返回的是字节形式的二进制数据 二进制--》字符串 解码 decode( 编码的格式…

部署lawyer-llama

Git - Downloading PackageGit - Downloading PackageGit - Downloading Package 下载git,wget需要下载一下 (GNU Wget 1.21.4 for Windows), Windows中git bash完全可以替代原生的cmd,但是对于git bash会有一些Linu…

一个基于SpringBoot+Vue前后端分离高校心理健康系统详细设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

仓储二代拣货标签接口

1.批量拣货更新标签信息接口 http://localhost/smartpick/associate/lightTags 代码形式: { url : http://localhost/smartpick/associate/lightTags, requestMethed : POST, requestParameter : { [ {"mac":"99.99.22.03","devty…

Docker中部署redis

1.部署redis要求 2.部署教程 连接容器中的redis redis部署完毕

Oracle-如何判断字符串包含中文字符串(汉字),删除中文内容及保留中文内容

今天遇见一个问题需要将字段中包含中文字符串的筛选出来 --建表 CREATE TABLE HADOOP1.AAA ( ID VARCHAR2(255) ); --添加字段INSERT INTO HADOOP1.AAA(ID)VALUES(理解);....--查询表内容SELECT * FROM HADOOP1.AAA;在网上查找了一下有以下三种方式: 第一种&#…

开源数据库Mysql_DBA运维实战 (DCL/日志)

SQL(Structured Query Language 即结构化查询语言) a.DDL语句 数据库定义语言: 数据库,表,视图,索引,存储过程,函数,创建删除ALTER(CREATE DROP ALTER) b.DML语句 数…

在Excel中将数值差距极大的两个序列用对比明显的折线图表示

在Excel中,如果两个数据序列的数值差距太大,用这样的数据序列生成折线图时,折线图会显得过于平缓,趋势对比不明显。如下图: 这时候只要将趋势图设置成双坐标轴,将其中一条趋势线绘制到次坐标轴上&#xff0…

java毕业设计-智慧食堂管理系统-内容快览

首页 智慧食堂管理系统是一种可以提高食堂运营效率的管理系统。它将前端代码使用Vue实现,后端使用Spring Boot实现。这个系统的目的是简化食堂管理,提高食堂服务质量。在现代快节奏的生活中,人们对餐饮服务提出了更高的要求,食堂管…

【Quarkus技术系列】「云原生架构体系」在云原生时代下的Java“拯救者”是Quarkus,那云原生是什么呢?

云原生时代下的Java"拯救者" 在云原生时代,其实Java程序是有很大的劣势的,以最流行的spring boot/spring cloud微服务框架为例,启动一个已经优化好,很多bean需要lazy load的application至少需要3-4秒时间,内…

C语言快速回顾(二)

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。C/C是音视频必…

【Github】SourceTree技巧汇总

sourceTree登录github账户 会跳转到浏览器端 按照Git Flow 初始化仓库分支 克隆远程仓库到本地 推送变更到远程仓库 合并分支 可以看到目前的本地分支(main、iOS_JS)和远程分支(origin/main、origin/HEAD、origin/iOS_JS)目前所处…

C++多线程场景中的变量提前释放导致栈内存异常

多线程场景中的栈内存异常 在子线程中尝试使用当前函数的资源&#xff0c;是非常危险的&#xff0c;但是C支持这么做。因此C这么做可能会造成栈内存异常。 正常代码 #include <iostream> #include <thread> #include <windows.h>// 线程函数&#xff0c;用…

消防态势标绘工具,为消防基层工作助力

背景介绍 无人机测绘技术在消防领域的应用越来越普及&#xff0c;高清的二维正射影像和倾斜摄影实景三维模型能为消防态势标绘提供高质量的素材&#xff0c;消防队急需一个简便易用的、能够基于这些二三维的高清地图成果进行态势标绘的工具软件&#xff0c;使得消防“六熟悉”…

Rust 重载运算符|复数结构的“加减乘除”四则运算

复数 基本概念 复数定义 由实数部分和虚数部分所组成的数&#xff0c;形如a&#xff0b;bi 。 其中a、b为实数&#xff0c;i 为“虚数单位”&#xff0c;i -1&#xff0c;即虚数单位的平方等于-1。 a、b分别叫做复数a&#xff0b;bi的实部和虚部。 当b0时&#xff0c;a&…

(二)结构型模式:2、桥接模式(Bridge Pattern)(C++实现示例)

目录 1、桥接模式&#xff08;Bridge Pattern&#xff09;含义 2、桥接模式应用场景 3、桥接模式的UML图学习 4、C实现桥接模式的示例 1、桥接模式&#xff08;Bridge Pattern&#xff09;含义 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#…

解决ubantu驱动掉了的问题

这里写自定义目录标题 解决ubuntu驱动掉了的问题 解决ubuntu驱动掉了的问题 首先确定是否有驱动&#xff1a; ls /usr/src | grep nvidia若有&#xff0c;则大概率是驱动版本与内核版本对应不上&#xff0c;则把内核版本切换为初始版本即可。参照&#xff1a;https://blog.cs…