当前位置: 首页 > news >正文

MongoDB 备份与恢复综述

目录

一、基本概述

二、逻辑备份

1、全量备份

2、增量备份

3、恢复

三、物理备份

1、cp/tar/fsync

2、WiredTiger 热备份

3、恢复

四、快照备份


一、基本概述

        MongoDB 是一种流行的 NoSQL 数据库,它使用文档存储数据,支持丰富的查询语言和索引功能。MongoDB 的设计目标是提供高性能、高可用性和易扩展性,广泛应用于各种类型的应用程序中。然而,任何数据库系统都有可能面临数据丢失的风险,因此备份是确保数据安全和可恢复性的重要手段。

        备份的重要性不言而喻,它不仅可以保护数据免受硬件故障、软件错误或人为操作失误的影响,还可以在灾难发生时快速恢复业务运营。对于 MongoDB 来说,备份尤其重要,因为它通常用于处理大量数据和高并发访问,一旦出现问题,可能会导致严重的业务中断和数据丢失。

        关于 Mongodb 数据库备份,可从逻辑备份、物理备份和快照备份三个方面进行介绍。

Database Layermongodump逻辑备份
File System Layercp/tar、fsync物理备份
Volume/Block Layerlvm snapshot、第三方快照驱动快照备份

(1)逻辑备份是通过导出数据库中的数据到一个文件或一组文件中来实现的。在 MongoDB 中,可以使用 mongodump 工具来进行逻辑备份。mongodump 会将数据库中的每个集合导出为一个 BSON 文件,同时还会生成一个元数据文件,记录集合的名称和其他信息。

        逻辑备份的优点是可以跨平台使用,并且可以很容易地恢复到不同的 MongoDB 实例上。缺点是备份过程可能会影响数据库的性能,并且在大型数据集上可能需要较长的时间来完成备份,恢复时速度很慢,特别是回放 oplog 时,速度~非常~非常~非常~慢。

(2)物理备份则是直接复制数据库的文件系统,包括数据文件、日志文件和配置文件等。在 MongoDB 中,可直接拷贝文件系统内数据文件来实现物理备份的,但是不支持热备份。有第三方厂商基于 MongoDB 存储引擎 WiredTiger 原生热备份进行定制,支持热备份。

        物理备份的优点是速度快,因为它不需要遍历整个数据库来导出数据,而是直接复制文件。此外,物理备份通常可以在数据库运行时进行,对性能的影响较小。缺点是物理备份可能无法跨平台使用,因为不同操作系统的文件系统格式可能不同。另外,如果数据库在备份过程中发生了变化,那么备份的数据可能不是完全一致的,所以备份过程中需要对数据库加锁,避免数据写入。

(3)快照备份是一种结合了逻辑备份和物理备份特点的方法。它通过创建数据库的快照来实现备份,这个快照包含了数据库在某个时间点的状态。在 MongoDB 中,可以使用 LVM(Logical Volume Manager)或其他存储层的快照功能来实现快照备份。

        快照备份的优点是可以提供几乎实时的备份,因为快照的创建速度非常快。此外,快照备份可以在不中断数据库服务的情况下进行。缺点是快照备份依赖于底层存储系统的支持,不是所有的存储系统都支持快照功能。另外,如果数据库在快照之后发生了更改,那么这些更改不会反映在快照中。

二、逻辑备份

        mongodump 是 mongo 集成的备份与恢复工具,功能也是十分的强大,其与 mongorestore 配合可以完成大多数场景的数据备份。不过在使用之前需要仔细的阅读相关文档,并实际操作测试其功能特性。而且需要注意,随着不同数据库的版本迭代,该工具的一些功能也会随之变化,需要考虑一些参数的兼容性,和 json 版本的迭代。

       使用 mongodump 可以对数据库进行全量备份与增量备份,这个可以在网上搜到很多脚本例子。但其还是存在一些功能缺陷,不过好在其在 github 上开放了源码(golang),用户可以基于其源码根据自己的需求进行修改。

        该方案的一个不可忽略的缺点就是性能太低了,远远不如物理备份。虽然可以备份的时候可以集合为单位进行多进程并发,但对数据库的负载也随之增大。所以很多厂商在做灾备产品时都不会考虑它。

1、全量备份

1. 导出数据库 db1 中的集合 t1 至同目录下的dump文件夹下./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t12. 导出至指定同目录下自定义的文件夹./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t1 -o selfdir3。 以集合为单位将备份数据输出到 stdout,实现流式备份./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t1 -o -

2、增量备份

需要数据库开启 oplog,通过按时间导出 local.oplog.rs 中的 oplog 数据实现增量备份。

可以配合 query 进行数据过滤,比如 时间戳、操作或数据空间的过滤。

./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d local -c oplog.rs --query '{ts:{$gte:Timestamp(1660014692, 1)}, op:{$ne:"n"}}'

3、恢复

        恢复时需要使用 mongorestore 工具,恢复增量数据时,需要回放 oplog 日志。

# 恢复集合数据
mongorestore --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin ./13-34/db1/t1.bson
# 回放日志
mongorestore --host 127.0.0.1:27017 --oplogReplay --dir deltaBK/ --oplogFile deltaBK/oplog.rs.bson

三、物理备份

        物理备份目前看只支持全量备份。在物理备份期间需要加锁,防止数据库数据写入。

1、cp/tar/fsync

# 1、加锁
db.fsyncLock();
# 2、执行备份操作
cp /usr/local/mongodb/data /backupdir/full
# 3、解锁
db.fsyncUnlock();

2、WiredTiger 热备份

        Mongodb 原生数据库不支持物理热备份,但是 WiredTiger 存储引擎是支持热备份的,但是该存储引擎存在一个问题,在热备份过程中,若有数据写入,磁盘空间会快速增长。MongoDB 的保守做法是不支持热备份。

        很多第三方厂商(例如 Percona MongoDB、阿里云 MongoDB)基于 WiredTiger 存储引擎(开源)热备份进行了定制,直接支持物理热备份。

3、恢复

        恢复时就很简单了,将原生文件拷贝到目标路径下,重新编辑数据库配置文件,重新拉起数据库。

         若灾备环境是副本集群,则需要进行如下设置。

# 副本集群下要调整数据库,删除 local 数据库后重启并初始化副本集群
mongod --dbpath /data/db
rs1:PRIMARY> use local
rs1:PRIMARY> db.dropDatabase()
rs1:PRIMARY> use admin
rs1:PRIMARY> db.shutdownServer({force: true})mongod --dbpath /data/db --replSet <replName>
mongo
# 初始化副本集群
rs.initiate( {_id : <replName>,members: [ { _id : 0, host : <host:port> } ]
})
# 若还需要添加从节点,则继续执行
rs.add( "10.90.9.101 : 27018" )
rs.add( "10.90.9.103 : 27018" )

四、快照备份

        使用快照工具对数据库数据文件所在卷进行快照操作。下面以 LVM Snapshot 为例。除了本博客介绍的流程以外,还可参考官方教程:

使用文件系统Atlas 备份快照备份和恢复自管理部署 - MongoDB手册 v 8.0https://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linux        LVM 快照是 Linux 系统中的一种数据备份技术,用于在特定时间点对逻辑卷进行“瞬间影像”保存。它通过写时复制(COW)技术实现,初始时几乎不占用额外空间,仅记录少量元数据,并与源逻辑卷共享数据块。当源逻辑卷中的数据发生变化时,LVM会将原始数据块的内容复制到快照区域,确保快照始终反映创建时刻的数据状态。这种机制使得快照能够高效利用存储空间,同时保证数据的一致性和可追溯性。在实际应用中,LVM快照常用于数据备份、恢复以及系统测试等场景。     

        关于快照的详细知识点,可以参考之前写的博客。

快照技术的基本介绍-CSDN博客https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450        我需要备份的数据存放在 /usr/local/mongodb 目录下,需要使用快照对其所在卷进行备份。

        详细步骤如下所示,需要注意,目标目录空间需要充足,需要可以完全存放数据库数据所在卷。做快照时 VG 需要有足够的剩余空间。

# 1、查看挂载目录分布,可执行 df -f 或 mount 命令,数据库数据存放在 /usr/local 下,所以我们需要备份 /dev/mapper/centos-root 卷
[root@localhost ~] df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G  6.1G   44G  13% /
devtmpfs                 3.8G     0  3.8G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G   13M  3.8G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1               1014M  170M  845M  17% /boot
/dev/mapper/centos-home   42G   37M   42G   1% /home
tmpfs                    781M   12K  781M   1% /run/user/42
tmpfs                    781M     0  781M   0% /run/user/0# 2、创建数据库数据所在 lv 的快照,该快照随着数据库的写入会持续增长
[root@localhost ~] lvcreate --size 10GB --snapshot --name root-snap01 /dev/mapper/centos-rootLogical volume "root-snap01" created.
# 查看 lv 列表
[root@localhost ~] lvsLV          VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Converthome        centos -wi-ao---- <41.12groot        centos owi-aos---  50.00groot-snap01 centos swi-aos---  10.00g      root   7.76swap        centos -wi-ao----  <7.88g# 3、备份卷数据,快照关联的 lv 卷的全部数据,不是快照数据本身,是快照关联的卷的全部数据,所以备份集占用的空间是该卷的大小
# 可压缩快照数据
[root@localhost ~] dd if=/dev/mapper/centos-root--snap01 | gzip > /home/mongodb_snap01.gz
# 或者 dd 将数据重定向到别的路径下
[root@localhost ~] dd if=/dev/mapper/centos-root--snap01 of=/root/bkdir/mongodb_snap01# 4、查看备份数据
[root@localhost mongo-dir] du -h /root/bkdir/mongodb_snap01
51G     /root/bkdir/mongodb_snap01

        恢复过程可参考官方流程。大致是先在目标机上创建 lv 卷,注意不需要格式化,直接将备份的数据卷文件写入创建的 lv 卷,之后挂载到文件系统中访问,重新配置数据库即可,配置数据库的过程可参考上一章“物理备份”的恢复流程。

使用文件系统Atlas 备份快照备份和恢复自管理部署 - MongoDB手册 v 8.0https://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshot

相关文章:

MongoDB 备份与恢复综述

目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;它使用文档存储数据&#xff0c;支持丰富的查询语言和索引…...

node.js 文件操作

在 Node.js 中&#xff0c;文件操作主要通过内置的 fs&#xff08;File System&#xff09;模块来实现。 1. 读取文件 const fs require("fs");// 异步读取文件fs.readFile("example.txt", "utf8", (err, data) > {if (err) {console.erro…...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换

形态变换 图像处理中的形态学操作是处理图像结构的有效方法。以下是一些常见的形态学操作的介绍及其在 OpenCV 中的实现示例。 1. 腐蚀&#xff08;Erosion&#xff09; 腐蚀操作通过消除图像边界来减少图像中的白色区域&#xff08;前景&#xff09;&#xff0c;使物体的边…...

Spark SQL中的from_json函数详解

Spark SQL中的from_json函数详解 在Spark SQL中&#xff0c;from_json是一个用于解析JSON数据的函数&#xff0c;主要用于将JSON格式的字符串解析为结构化的数据&#xff08;即StructType或其他Spark SQL数据类型&#xff09;。这个函数在处理半结构化数据&#xff08;如JSON日…...

【软件架构】软件的十二种架构简介

软件的十二种架构简介 一、软件的12种架构 1. 单体架构 (Monolithic Architecture)2. 分层架构 (Layered Architecture)3. 事件驱动架构 (Event-Driven Architecture)4. 微服务架构 (Microservices Architecture)5. 服务导向架构 (Service-Oriented Architecture, SOA)6. 客户…...

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图&#xff0c;月度数据可视化图表&#xff0c;vue组件 先看效果&#x1f447; 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间&#xff0c;开始时间是 上一年的今天&#xff0c;例如2024/01/01 —— 2025/01/01&#xff0c;跨度刚…...

Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制

在Vue 3中&#xff0c;导航守卫&#xff08;Navigation Guard&#xff09;用于拦截路由的变化&#xff0c;可以在用户访问页面前进行检查。结合Axios进行token认证机制时&#xff0c;我们可以通过导航守卫在路由跳转时&#xff0c;检查用户的认证状态&#xff0c;确保用户有有效…...

【爬虫】使用 Scrapy 框架爬取豆瓣电影 Top 250 数据的完整教程

前言 在大数据和网络爬虫领域&#xff0c;Scrapy 是一个功能强大且广泛使用的开源爬虫框架。它能够帮助我们快速地构建爬虫项目&#xff0c;并高效地从各种网站中提取数据。在本篇文章中&#xff0c;我将带大家从零开始使用 Scrapy 框架&#xff0c;构建一个简单的爬虫项目&am…...

一分钟学习数据安全——白盒加密及安当应用

白盒加密作为一种先进的加密技术&#xff0c;在数据安全、通信安全和信息隐私保护等多个关键领域都有应用。这次的一分钟&#xff0c;让您快速了解一下白盒加密的概念&#xff0c;以及安当产品中的白盒加密应用。 一、什么是白盒加密 简单来说&#xff0c;白盒加密是一种特殊…...

composer安装指定php版本, 忽略平台原因导致的报错

windows下 //composer安装指定php版本, 写出完整的php和composer.phar路径 D:\phpstudy_pro\Extensions\php\php8.1.11nts\php.exe D:\phpstudy_pro\Extensions\composer1.8.5\composer.phar install windows下一些扩展不支持, 如下图, 所以本地composer安装组件时可以忽略 …...

Java 前端详解

Java 前端详解 Java 前端开发主要涉及使用 Java 相关技术和框架来创建用户界面和处理用户交互。虽然 Java 原本是后端开发的主力语言&#xff0c;但它也提供了许多前端开发工具和框架。以下是 Java 前端开发的主要内容和技术栈。 一、Java 前端技术栈 Java Swing 和 AWT AWT (…...

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…...

Javaweb之css

css的三种引入方式 1内行式 2.内嵌式 3.外部样式表 内行式和内嵌式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...

实施工程师:面试基础宝典

一.运维工程师和实施工程师的区别&#xff1a;工作内容不同、职能不同、工作形式不同 1.工作内容不同&#xff1a; 运维工程师要对公司硬件和软件进行维护。 硬件包括&#xff1a;机房、机柜、网线光纤、PDU、服 务器、网络设备、安全设备等。 实施工程师包括常用操作系统、应…...

react install

react 安装 React 是一个用于构建用户界面的 JavaScript 库。以下是安装 React 的步骤&#xff1a; 使用 Create React App Create React App 是一个官方支持的命令行工具&#xff0c;用于快速搭建 React 应用。 安装 Node.js 和 npm 确保你的计算机上安装了 Node.js 和 npm…...

ElasticSearch DSL查询之排序和分页

一、排序功能 1. 默认排序 在 Elasticsearch 中&#xff0c;默认情况下&#xff0c;查询结果是根据 相关度 评分&#xff08;score&#xff09;进行排序的。我们之前已经了解过&#xff0c;相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…...

uniapp封装websocket

WebSocket介绍 后端使用的是springbootnetty做websocket的服务端&#xff0c;参考我其他博文 项目使用场景 开发uniapp项目时&#xff0c;需要进行实时通信&#xff0c;比如聊天等。需要封装一个工具类&#xff0c;统一对socket进行管理。 uniapp websocket官方文档&#xff1…...

【Linux】18.Linux进程控制(2)

文章目录 3. 进程程序替换3.1 单进程版 -- 看看程序替换3.2 替换原理3.3 替换函数函数解释命名理解 3.4 多进程版 -- 验证各种程序替换接口3.5 自定义shell 3. 进程程序替换 3.1 单进程版 – 看看程序替换 makefile mycommand:mycommand.cgcc -o $ $^ -stdc99 .PHONY:clean …...

reactor框架使用时,数据流请求流程

1. 我们在Flux打开时&#xff0c;可以看到 public abstract class Flux<T> implements CorePublisher<T> { 2. public interface CorePublisher<T> extends Publisher<T> {void subscribe(CoreSubscriber<? super T> subscriber); } Publish…...

读西瓜书的数学准备

1&#xff0c;高等数学&#xff1a;会求偏导数就行 2&#xff0c;线性代数&#xff1a;会矩阵运算就行 参考&#xff1a;线性代数--矩阵基本计算&#xff08;加减乘法&#xff09;_矩阵运算-CSDN博客 3&#xff0c;概率论与数理统计&#xff1a;知道啥是随机变量就行...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...