【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据

news2024/12/29 9:24:14

【腾讯云 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框架

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot3入门第一章

现状 俗话说,买新不买旧,学技术也一样,学最新的技术,因为时代会给先行者最为优厚的回报 第一章 构建SpringBoot项目 这个因为太久没有用SpringBoot,导致好多东西都忘记了,就很烦 好在这里面东西并不多&…

【网络基础】网络通信

【网络基础】网络通信 文章目录 【网络基础】网络通信1、网络基础1.1 计算机网络1.2 网络模型TCP & UDP1)IP地址2)端口3)TCP协议与UDP协议的比较 1.3 网络传输1.3.1 传输逻辑1.3.2 传输条件1.3.3 传输流程 1.4 地址管理 2、网络编程2.1 基…

React源码解析18(7)------ 实现事件机制(onClick事件)

摘要 在上一篇中,我们实现了useState的hook,但由于没有实现事件机制,所以我们只能将setState挂载在window上。 而这一篇主要就是来实现事件系统,从而实现通过点击事件进行setState。 而在React中,虽然我们是将事件绑…

ssm基于ssm的人才招聘网站源码和论文

ssm基于ssm的人才招聘网站源码和论文020 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 选题依据(研究的背景、目的和意义等) 在Internet飞速发展的今天,互联网成为人们快…

如何保证数据传输的安全?

要确保数据传输的安全,您可以采取以下措施: 使用加密协议:使用安全的传输协议,如HTTPS(HTTP over SSL/TLS)或其他安全协议,以保护数据在传输过程中的安全性。加密协议可以有效防止数据被窃听或篡改。 强化身份验证&…

【从零学习python 】28. Python中的局部变量和全局变量

文章目录 局部变量全局变量全局变量和局部变量名字相同问题修改全局变量查看所有的全局变量和局部变量函数返回值一、多个return?二、一个函数返回多个数据的方式 对返回的数据直接拆包进阶案例 局部变量 局部变量,就是在函数内部定义的变量其作用范围是这个函数内…

Java-java中的类,main函数和文件名的关系

java中的类,main函数和文件名的关系 类与文件名的关系 一个java文件中可以定义多个类,但是最多只有一个类被public修饰,并且这个类的类名与文件名必须相同,若这个文件中没有public的类,则文件名随便是一个类的名字即可…

JavaWeb-Filter过滤器

目录 Filter过滤器 1. Filter的生命周期 2.Filter的配置 3.拦截路径 4.拦截具体的使用 5.拦截方式配置(资源被访问方式) 6.FilterChain拦截链 Filter过滤器 filter是过滤器,相比于Servlet的发送请求,filter是用于拦截请求。…

电脑打开对话框中没有桌面这个选项解决办法

问题描述: 左侧栏中的桌面图标不显示 解决方法: 左侧的空白处右键-显示所有的文件夹 这时所有的文件夹都显示了!

我给 PostgreSQL 官方 JDBC 驱动修复了一个高并发性能问题

这是我在 2022 年给 PostgreSQL 官方 JDBC 驱动 修复的一个高并发性能问题。 该问题影响的版本范围是 pgjdbc: 42.3.242.3.3 Issue: Concurrent performance issue in 42.3.2 caused by #2291 https://github.com/pgjdbc/pgjdbc/issues/2450 PR: Use non-synchro…

[Mongodb 5.0]聚合操作

本文对应Aggregation Operations — MongoDB Manual 正文 此章节主要介绍了Aggregation Pipeline,其实就是将若干个聚合操作放在管道中进行执行,每一个聚合操作的结果作为下一个聚合操作的输入,每个聚合指令被称为一个stage。 在正式开始学…

Vue使用jspdf和html2canvas组件库结合导出PDF文件

效果图: 1、安装依赖: npm install html2canvas --save npm install jspdf --save 或 yarn add html2canvas --save yarn add jspdf --save 2、封装全局调用方法:this.$exportPDF(#id,文件名) 新建js文件:/utils/html2Pdf.js&am…

Nginx 服务优化与防盗链

Nginx隐藏版本号、服务名 1. 改配置文件 HTTP模块中添加命令:server_tokens off; 关闭防火墙、安全机制 将配置文件备份一份,再进行配置 2. 改源码包 /opt/nginx-1.22.0/src/core/nginx.h #define NGINX_VERSION "1.1.1" #修改…

SSH公网远程直连Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 在某些特殊需求下,我们想ssh直接远程连接docker 容器,下面我们介绍结合cpolar工具实现ssh远程直接连接docker容器…

【BASH】回顾与知识点梳理(二十七)

【BASH】回顾与知识点梳理 二十七 二十七. 磁盘配额(Quota)27.1 磁盘配额 (Quota) 的应用与实作什么是 QuotaQuota 的一般用途Quota 的使用限制Quota 的规范设定项目 27.2 一个 XFS 文件系统的 Quota 实作范例实作 Quota 流程:设定账号实作 Quota 流程-1&#xff1a…

使用 PostgreSQL 创建全文搜索引擎2:Postgres 与 Elasticsearch

使用 PostgreSQL 作为全文搜索引擎很诱人,因为它需要的基础设施较少。但它的搜索相关功能集是否足以与基于 Lucene 的替代方案竞争? 在第 1 部分中,我们深入研究了 PostgreSQL 全文搜索的功能,并探讨了如何实现相关性提升(releva…

如何选择最佳的文件传输协议?(FTP、TFTP、Raysync)

在数字化时代,通过互联网传输文件是一项常见的任务。因此,选择适合您企业需求的文件传输协议非常重要。 文件传输协议是发送方和接收方之间的一套规则和信息。它的作用就像网络两端都能理解的一种语言,使得数据可以正确输出并带有正确的文件…

SRM订单管理:优化供应商关系

一、概述SRM订单管理的概念: SRM订单管理是指在供应商关系管理过程中,有效管理和控制订单的创建、处理和交付。它涉及与供应商之间的沟通、合作和协调,旨在实现订单的准确性、可靠性和及时性。 二、SRM订单管理的流程: 1. 订单创…

问道管理:缩量小幅上涨说明什么?

股市里面,股票价格上涨或跌落都是常见现象。可是关于那些在商场上寻求收益的出资者来说,他们需要对每一个股市中的价格动摇有深化的了解,以便做出更正确的出资决策。最近,出资者们发现商场缩量小幅上涨的现象时有发生,…

SpringBoot复习:(51)默认情况下DataSource是怎么创建出来的,是什么类型的?

DataSource是通过DataSourceAutoConfiguration创建的,这个类代码如下: 可以看到DataSourceAutoConfiguration有个静态内部类PooledDataSourceConfiguration,在这个类上有个Import注解,导入了DataSourceConfiguration.Hikari这个类&#xff0…