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

ubuntu系统每天凌晨定时上传redis 备份数据到阿里云OSS上

1.压缩备份脚本

1.1 代码如下
#!/bin/bash# redis_backup_compress.sh
# 设置变量
BACKUP_DIR="/data/redis/backup"
REDIS_DIR="/var/lib/redis"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="redis_backup_${DATE}.rdb"
COMPRESSED_FILE="redis_backup_${DATE}.tar.gz"
OSS_BUCKET="your-bucket-name"
OSS_PATH="redis/backup/"# 阿里云访问凭证
ACCESS_KEY="your_access_key"
ACCESS_SECRET="your_access_secret"
ENDPOINT="oss-cn-beijing.aliyuncs.com"# 创建备份目录
mkdir -p ${BACKUP_DIR}# 记录日志函数
log() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> "${BACKUP_DIR}/backup.log"echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}# 检查并安装必要工具
check_tools() {for tool in ossutil64 tar pigz; doif ! command -v $tool &> /dev/null; thenlog "Installing $tool..."case $tool in"ossutil64")wget http://gosspublic.alicdn.com/ossutil/1.7.7/ossutil64 -O /usr/local/bin/ossutil64chmod 755 /usr/local/bin/ossutil64;;"pigz")apt-get update && apt-get install -y pigz;;"tar")apt-get update && apt-get install -y tar;;esacfidone
}# 配置ossutil
configure_ossutil() {if [ ! -f ~/.ossutilconfig ]; thenlog "Configuring ossutil..."ossutil64 config -e ${ENDPOINT} -i ${ACCESS_KEY} -k ${ACCESS_SECRET}fi
}# 备份Redis
backup_redis() {log "Starting Redis backup..."# 复制当前的dump.rdb文件if cp ${REDIS_DIR}/dump.rdb ${BACKUP_DIR}/${BACKUP_FILE}; thenlog "Redis backup created: ${BACKUP_FILE}"# 使用tar和pigz进行多线程压缩log "Compressing backup file..."cd ${BACKUP_DIR}if tar cf - ${BACKUP_FILE} | pigz -9 -p 4 > ${COMPRESSED_FILE}; thenlog "Backup compressed successfully: ${COMPRESSED_FILE}"# 删除原始备份文件rm ${BACKUP_FILE}return 0elselog "Failed to compress backup"return 1fielselog "Failed to create Redis backup"return 1fi
}# 计算文件MD5
calculate_md5() {local file=$1md5sum ${file} | cut -d' ' -f1
}# 上传到阿里云OSS
upload_to_oss() {log "Uploading compressed backup to OSS..."local file_path="${BACKUP_DIR}/${COMPRESSED_FILE}"local md5_before=$(calculate_md5 ${file_path})# 使用ossutil的断点续传功能上传if ossutil64 cp -u ${file_path} \oss://${OSS_BUCKET}/${OSS_PATH}${COMPRESSED_FILE} \--parallel 4 \--checkpoint-dir ${BACKUP_DIR}/.checkpoint_dir; then# 验证上传ossutil64 cp oss://${OSS_BUCKET}/${OSS_PATH}${COMPRESSED_FILE} \${BACKUP_DIR}/verify_${COMPRESSED_FILE} --parallel 4local md5_after=$(calculate_md5 ${BACKUP_DIR}/verify_${COMPRESSED_FILE})if [ "${md5_before}" = "${md5_after}" ]; thenlog "Backup uploaded and verified successfully"rm ${BACKUP_DIR}/verify_${COMPRESSED_FILE}return 0elselog "Upload verification failed"return 1fielselog "Failed to upload backup to OSS"return 1fi
}# 清理旧备份
cleanup_old_backups() {log "Cleaning up old backups..."# 保留本地最近3天的备份find ${BACKUP_DIR} -name "redis_backup_*.tar.gz" -type f -mtime +3 -delete# 清理OSS上30天前的备份ossutil64 rm oss://${OSS_BUCKET}/${OSS_PATH} --recursive --force \--include "redis_backup_*.tar.gz" \--timerange "30daysago"# 清理检查点目录find ${BACKUP_DIR}/.checkpoint_dir -mtime +1 -type f -delete
}# 监控备份大小
monitor_backup_size() {local file_size=$(du -h ${BACKUP_DIR}/${COMPRESSED_FILE} | cut -f1)local compression_ratio=$(echo "scale=2; $(stat -f %z ${REDIS_DIR}/dump.rdb) / \$(stat -f %z ${BACKUP_DIR}/${COMPRESSED_FILE})" | bc)log "Backup size: ${file_size}, Compression ratio: ${compression_ratio}x"# 如果备份文件异常大,发送告警if [ $(stat -f %z ${BACKUP_DIR}/${COMPRESSED_FILE}) -gt 1073741824 ]; then # 1GBsend_notification "WARNING" "Backup file is larger than 1GB: ${file_size}"fi
}# 发送通知
send_notification() {local status=$1local message=$2# 这里可以集成你的通知方式(邮件、钉钉、企业微信等)if [ -n "${NOTIFICATION_WEBHOOK}" ]; thencurl -X POST ${NOTIFICATION_WEBHOOK} \-H 'Content-Type: application/json' \-d "{\"status\":\"${status}\",\"message\":\"${message}\"}"fi
}# 主函数
main() {log "=== Starting backup process ==="# 检查并安装工具check_toolsconfigure_ossutil# 执行备份if backup_redis; thenmonitor_backup_size# 上传到OSSif upload_to_oss; thenlog "Backup process completed successfully"send_notification "SUCCESS" "Redis backup completed and uploaded to OSS"# 清理旧备份cleanup_old_backupselselog "Backup process failed during upload"send_notification "FAILED" "Failed to upload Redis backup to OSS"exit 1fielselog "Backup process failed during backup creation"send_notification "FAILED" "Failed to create Redis backup"exit 1filog "=== Backup process finished ==="
}# 执行主函数
main

2. 解压恢复脚本

2.1 代码如下
#!/bin/bash# redis_restore_decompress.sh
BACKUP_DIR="/data/redis/backup"
REDIS_DIR="/var/lib/redis"
OSS_BUCKET="your-bucket-name"
OSS_PATH="redis/backup/"# 参数检查
if [ $# -ne 1 ]; thenecho "Usage: $0 <compressed_backup_file_name>"exit 1
fiCOMPRESSED_FILE=$1
BACKUP_FILE="${COMPRESSED_FILE%.tar.gz}.rdb"# 从OSS下载压缩的备份
download_from_oss() {echo "Downloading compressed backup from OSS..."ossutil64 cp oss://${OSS_BUCKET}/${OSS_PATH}${COMPRESSED_FILE} \${BACKUP_DIR}/${COMPRESSED_FILE} --parallel 4
}# 解压备份
decompress_backup() {echo "Decompressing backup..."cd ${BACKUP_DIR}pigz -d < ${COMPRESSED_FILE} | tar xf -if [ -f "${BACKUP_DIR}/${BACKUP_FILE}" ]; thenecho "Backup decompressed successfully"return 0elseecho "Failed to decompress backup"return 1fi
}# 恢复备份
restore_backup() {echo "Stopping Redis server..."sudo service redis stopecho "Restoring backup..."sudo cp ${BACKUP_DIR}/${BACKUP_FILE} ${REDIS_DIR}/dump.rdbsudo chown redis:redis ${REDIS_DIR}/dump.rdbecho "Starting Redis server..."sudo service redis start# 验证Redis是否正常启动sleep 5if redis-cli ping | grep -q "PONG"; thenecho "Redis server started successfully"return 0elseecho "Failed to start Redis server"return 1fi
}# 清理临时文件
cleanup() {rm -f ${BACKUP_DIR}/${COMPRESSED_FILE}rm -f ${BACKUP_DIR}/${BACKUP_FILE}
}# 主函数
main() {echo "=== Starting restore process ==="# 下载压缩的备份download_from_oss# 解压备份if decompress_backup; then# 恢复备份if restore_backup; thenecho "=== Restore process completed successfully ==="cleanupelseecho "=== Restore process failed ==="exit 1fielseecho "=== Restore process failed during decompression ==="exit 1fi
}main

3.使用说明

3.1 安装必要工具:
sudo apt-get update
sudo apt-get install -y wget pigz tar bc mailutils
3.2 设置执行权限:
sudo chmod +x redis_backup_compress.sh
sudo chmod +x redis_restore_decompress.sh
3.3 配置定时任务:
# 编辑crontab
crontab -e# 添加以下内容(每天凌晨2点执行)
0 2 * * * /path/to/redis_backup_compress.sh
3.4 手动测试:
# 执行备份
sudo ./redis_backup_compress.sh# 查看压缩文件大小
ls -lh /data/redis/backup/# 恢复备份
sudo ./redis_restore_decompress.sh redis_backup_20240101_020000.tar.gz

相关文章:

ubuntu系统每天凌晨定时上传redis 备份数据到阿里云OSS上

1.压缩备份脚本 1.1 代码如下#!/bin/bash# redis_backup_compress.sh # 设置变量 BACKUP_DIR"/data/redis/backup" REDIS_DIR"/var/lib/redis" DATE$(date %Y%m%d_%H%M%S) BACKUP_FILE"redis_backup_${DATE}.rdb" COMPRESSED_FILE"redis_b…...

uniapp结合movable-area与movable-view实现拖拽功能

前言 因为公司业务开发需要拖拽功能。 ps&#xff1a;该功能只能针对高度一致的&#xff0c;如果高度不一致需要另外二开 演示 开始 <template><view style"height: 100%;"><movable-area :style"{width: 100%, height: allHeight px}"…...

JavaScript 单例模式的创建与应用

JavaScript 单例模式的创建与应用 单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供全局访问点。在 JavaScript 中&#xff0c;单例模式可以帮助我们避免多次创建同一个对象&#xff0c;节省资源&a…...

【HarmonyOS】 鸿蒙保存图片或视频到相册

【HarmonyOS】 鸿蒙保存图片或视频到相册 前言 鸿蒙中保存图片或者视频&#xff0c;或者其他媒体文件到设备的媒体库&#xff0c;可以是相册&#xff0c;也可以是文件管理等。共有两种方式&#xff1a; 需要应用申请受限权限&#xff0c;获取文件读写的权限&#xff08;调用…...

windows下nacos启动报错:java.lang.unsatisfiedLinkError: C:\USers\乱码AppData\xxx.dll

问题 看了许多别的帖子&#xff0c;大家都是因为缺少dll包&#xff0c;下载安装 Microsoft Visual C 2015 Redistributable 就可以。但我试过了不行。思来想去&#xff0c;之前正常的时候用的JDK版本是17&#xff0c;后面别的项目用1.8给切换回来了。然后尝试配置环境变量将JD…...

梳理你的思路(从OOP到架构设计)_基本OOP知识01

目录 1、“-Oriented” 的涵意 2、 ” -Oriented”、” -Based”、” -Driven”、” -Centered” 它们之间区别 3、 从对象(Object) 谈起 4、类的用途&#xff1a; 叙述软件对象 Android从程序员到架构师之路&#xff1a;梳理你的思路(从OOP到架构设计) 1、“-Oriented” …...

【C++图论 BFS算法】2467. 树上最大得分和路径|2053

本文涉及知识点 C图论 CBFS算法 LeetCode2467. 树上最大得分和路径 一个 n 个节点的无向树&#xff0c;节点编号为 0 到 n - 1 &#xff0c;树的根结点是 0 号节点。给你一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ai, bi] &#xff0c;表示节点 a…...

Java的Mvc整合Swagger的knife4框架

Swagger的介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger&#xff0c;就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述 文件可以去更…...

AI项目二十六:YOLOV11简单部署测试

若该文为原创文章&#xff0c;转载请注明原文出处。 一、YOLOv11介绍 继YOLOv 8、YOLOv 9和YOLOv10之后&#xff0c;发布的YOLOV11引入了几个突破性的增强功能&#xff0c;为目标检测和计算机视觉设定了新的基准。 增强的特征提取&#xff1a;YOLOv11使用改进的主干和颈部架构…...

19. Three.js案例-创建一个带有纹理映射的旋转平面

19. Three.js案例-创建一个带有纹理映射的旋转平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它利用 WebGL 技术在浏览器中绘制 3D 图形。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobj…...

【Makefile】编译日志之输出重定向符号 >

用法1 make all >& compilelog.txt make all > compilelog.txt这两个编译命令在功能上有一些细微的区别&#xff0c;主要在于标准输出和标准错误的处理方式。 make all >& compilelog.txt 这个命令会将标准输出&#xff08;stdout&#xff09;和标准错误&a…...

TDengine 新功能 复合主键

1. 简介 从 TDengine 3.3.0.0 版本之后&#xff0c;新增了复合主键的功能。 TDengine 原来的时间列是不允许有重复时间戳的&#xff0c;有了复合主键功能后&#xff0c;时间列即允许有重复&#xff0c;重复后的时间戳按紧跟其后第二列主键列的值来确定唯一性。 此功能的常用…...

【OpenHarmony】初识设备间互联互通的统一基础:分布式软总线

分布式软总线 前言软总线软总线代码目录软总线传输模块概述传输模块主要对外接口和使用方式 前言 很久没有写出一篇能够分享出来的学习心得了&#xff0c;零零散散地写了好多&#xff0c;总是不太满意。今年8月份开始正式投入精力去学习open harmony&#xff0c;记得第一次接触…...

yocto加软件包install 动态链接库报错

加入bb文件,编译通过 在install时报错 报错 ERROR: demo-1.0-r0 do_package_qa: QA Issue: -dev package agent-dev contains non-symlink .so ‘/usr/lib64/libdemo.so’ 解决 在bb文件install前加2行 SOLIBS ".so" FILES_SOLIBSDEV ""do_install …...

《数据结构》(408代码题)

2009 单链表&#xff08;双指针&#xff09; 分析&#xff1a;首先呢&#xff0c;给我们的数据结构是一个带有表头结点的单链表&#xff0c;也不允许我们改变链表的结构。链表的长度不是直接给出的啊&#xff0c;所以这个倒数也很棘手。那我们该如何解决这个“k”呢&#xff0c…...

哈希表的完善及unordered_map/unordered_set封装

1.哈希表的完善 1.1 优化&#xff1a;哈希函数 在实际使用中&#xff0c;往往需要以字符串作为存储依据(键值)&#xff0c;比如姓名与快递信息、商品名称与价格、中文单词与英文释义等。 而在上一篇文章中&#xff0c;我们实现的哈希表只考虑了整型的存储情况&#xff0c;即直…...

“物联·数据·产融·场景”聚力垂直数智场景下的新质生产力破局

人工智能、物联网&#xff08;简称AIOT&#xff09;正在深刻改变世界的经济格局&#xff0c;对各行各业产生深厚的影响。12月6日&#xff0c;由深圳市物联网协会、华夏银行深圳分行、深圳市区块链技术应用协会、深圳市康复辅助器具智能技术应用协会联合主办的第五届AIOT生态大会…...

API接口的性能测试与优化策略

在现代软件开发中&#xff0c;API&#xff08;应用程序编程接口&#xff09;扮演着至关重要的角色&#xff0c;它们作为不同服务之间的桥梁&#xff0c;确保数据的顺畅流通与交互。然而&#xff0c;随着用户需求的不断增长和系统复杂性的提升&#xff0c;API接口的性能问题日益…...

【Vue】Part4 接口调用

接口调用方式 原生ajax基于jQuery的ajaxfetchaxios 异步 JavaScript的执行环境是「单线程」所谓单线程&#xff0c;是指JS引擎中负责解释和执行JavaScript代码的线程只有一个&#xff0c;也就是一次只能完成一项任务&#xff0c;这个任务执行完后才能执行下一个&#xff0c;…...

管理系统前端框架开发案例学习

一、 需求分析 本案例的主要目标是开发一个智能学习辅助系统的前端界面&#xff0c;涵盖以下功能模块&#xff1a; 首页&#xff1a;显示系统的总体概览和关键功能介绍。 班级学员管理&#xff1a;实现班级管理和学员管理。 系统信息管理&#xff1a;管理部门和员工信息。 …...

协程设计原理与实现

协程设计原理与汇编实现 同步与异步 对于任何一个事情&#xff0c;都可以划分为不同的步骤。所谓同步&#xff0c;就先做第一个事情&#xff0c;按照这件事的步骤完成这件事之后&#xff0c;再去做第二件事。再去做第三件事&#xff0c;以此类推。 异步就是&#xff0c;可以…...

c++广播通讯的实现

概念大家都很清楚&#xff0c;不赘述。 广播必然用UDP这套东西。 setsockopt() 函数及其在广播中的应用&#xff1a; 在 C 网络编程中&#xff0c;setsockopt() 函数用于设置套接字选项&#xff0c;这些选项可以控制套接字的各种行为。对于广播通信&#xff0c;我们特别关心…...

Leetcode 3377. Digit Operations to Make Two Integers Equal

Leetcode 3377. Digit Operations to Make Two Integers Equal 1. 解题思路2. 代码实现 题目链接&#xff1a;3377. Digit Operations to Make Two Integers Equal 1. 解题思路 这一题的核心思路属于路径遍历问题&#xff0c;我们使用一个堆排来控制最优路径的选择。 我们首…...

高项 - 项目管理原则与项目绩效域

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 博文更新参考时间点&#xff1a;2024-12 高项 - 章节与知识点汇总&#xff1a;点击跳转 文章目录 高项 - 项目管理原则与项目绩效域项目管理12条原则原则1&#xff1a;成为勤勉、尊重和关心他人的管家 (p202)原则…...

【开源】A065—基于SpringBoot的库存管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…...

LeetCode—189. 轮转数组(中等)

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3输出:[5,6,7,1,2,3,4] 解释: 向右轮转 1 步:[7,1,2,3,4,5,6] 向右轮转 2 步:[6,7,1,2,3,4,5] 向…...

fastadmin框架同时使用 阿里云oss和阿里云点播

背景 项目的实际需求中既要用到阿里云oss产品又用到阿里云点播系统&#xff0c;实现完美的统一。设置两个地址downUrl&#xff0c;thirdCode。分别代表阿里云oss上传路径和阿里云点播系统vId。 实现 默认框架你已经集成好阿里云oss集成工作&#xff0c;前端html页面实现 <…...

MySQL-DML之数据表操作

文章目录 一. 插入表记录1. 向表中插入部分字段2. 向表中插入所有字段,字段的顺序为创建表时的顺序3. 一次添加多条数据信息 二. 更新表记录1. 更新所有记录的指定字段 更新符号条件记录的指定字段2. 更新符号条件记录的指定字段 三. 删除表记录1. 按条件删除记录2. 清空记录 四…...

Android 逆向/反编译/Hook修改应用行为 基础实现

前言&#xff1a;本文通过一个简单的情景案例实现安卓逆向的基本操作 一、情景描述 本文通过一个简单的情景案例来实现安卓逆向的基本操作。在这个案例中所使用的项目程序是我自己的Demo程序&#xff0c;不会造成任何的财产侵害&#xff0c;本文仅作为日常记录及案例分享。实…...

【前端】理解 JavaScript 对象属性访问的复杂性

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;理论基础&#xff1a;JavaScript 对象属性的访问模式1. 点符号访问&#xff08;Dot Notation&#xff09;2. 方括号访问&#xff08;Bracket Notation&#xff09;点符号…...

进入 Dystopia:第九周游戏指南

本指南将为大家详细说明在第八周的每个体验中可以获得的奖励。 在杂草丛生的反乌托邦废墟中生存&#xff0c;随着大自然重新开垦这片土地&#xff0c;文明已陷入绝望。穿越高耸入云、摇摇欲坠的摩天大楼&#xff0c;抵御末世社会的各种危险。适应这个文明与荒野之间的界限已经消…...

Helm安装Mysql8主从复制集群

目录 一、Helm安装 二、安装mysql 1、拉取镜像 2、修改配置文件 3、创建mysql-secret 4、安装 一、Helm安装 这里不再赘叙&#xff0c;具体安装请参考官网 Helm | 快速入门指南 二、安装mysql 1、拉取镜像 #添加仓库 helm repo add bitnami https://charts.bitnami.c…...

[小白系列]GPU-nvidia-smi指令

‌nvidia-smi&#xff08;NVIDIA System Management Interface&#xff09;是一种命令行实用程序&#xff0c;用于监控和管理NVIDIA GPU&#xff08;图形处理器&#xff09;的状态和性能‌。它提供了一种简单而强大的方式来获取有关GPU的实时信息&#xff0c;并且可以用于诊断、…...

Flutter 图片编辑板(一) 事件路由

一个图片编辑板&#xff0c;有两部分组成。编辑板和内容项。每一个内容项是被InteractiveViewer修饰的widget&#xff0c;具有缩放偏移的功能。 在图片编辑板上&#xff0c; 会有多个内容相&#xff0c;图片或文字&#xff08;添加文字目前还没做过&#xff09;。 当要编辑其中…...

Cherno C++学习笔记 P33 字符串的字面量

在这篇文章当中我们介绍一下有关于字符串更加深入的知识&#xff0c;也就是字符串的字面量。 首先什么是字面量&#xff1f;其实也很简单&#xff0c;就是双引号里面的那一坨&#xff0c;其实就是字面量&#xff0c;我们举一个最简单的例子&#xff1a; #include<iostream…...

数据结构 (36)各种排序方法的综合比较

一、常见排序方法分类 插入排序类 直接插入排序&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。希尔排序&#xff1a;是插入排序的一种改进版本&#xff0c;先将整个待排序的记录序列分割成为…...

Master EDI 项目需求分析

Master Electronics 通过其全球分销网络&#xff0c;支持多种采购需求&#xff0c;确保能够为客户提供可靠的元件供应链解决方案&#xff0c;同时为快速高效的与全球伙伴建立合作&#xff0c;Master 选择通过EDI来实现与交易伙伴间的数据传输。 EDI为交易伙伴之间建立了一个安…...

java+ssm+mysql计算机等级考试网

项目介绍&#xff1a; 使用javassmmysql开发的计算机等级考试信息网&#xff0c;系统包含前后台&#xff0c;包含超级管理员&#xff0c;系统管理员角色&#xff0c;功能如下&#xff1a; 前台&#xff1a;首页&#xff1b;考试动态&#xff1b;相关资源下载&#xff1b;考试…...

MitelMiCollab 身份绕过导致任意文件读取漏洞复现(CVE-2024-41713)

0x01 产品描述: Mitel MiCollab 是一个企业协作平台,它将各种通信工具整合到一个应用程序中,提供语音和视频通话、消息传递、状态信息、音频会议、移动支持和团队协作功能。0x02 漏洞描述: Mitel MiCollab 的 NuPoint 统一消息 (NPM) 组件中存在身份验证绕过漏洞,由于输入…...

【Python]深入Python日志管理:从logging到分布式日志追踪的完整指南

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 日志是软件开发中的核心部分,尤其在分布式系统中,日志对于调试和问题定位至关重要。本篇文章将从Python标准库的logging模块出发,逐步探讨日志管理的最佳实践,涵盖日志配置、日志分层、日志格式化等基…...

python rstrip 的迷惑行为

在项目中&#xff0c;我需要把字符串末尾的一部分去掉&#xff0c;类似截断&#xff0c;我用ide的随笔提示&#xff0c;发现了rstrip这个方法&#xff0c;然后我试了下&#xff0c;满足我的需求&#xff0c;但在测试过程中&#xff0c;我发现了rstrip的一些行为很让我迷惑。 开…...

SPI通信协议

SPI通信协议 简介通信原理通信原理SPI数据通信的流程可以分为以下几步&#xff1a;通信特性设备时钟时钟速率时钟极性跟相位SPI协议层通讯流程详解优点&#xff1a;缺点&#xff1a; DS1302 时钟实验控制寄存器日历、时钟寄存器寄存器说明 DS1302 读写时序软件功能实现 简介 SP…...

vue中如何实现商品多规格添加(后台商城管理系统)

在制作商城类的后台管理系统中会遇到多规格商品的添加&#xff0c;需要向固定的数组内添加&#xff0c;通过查看数据结构正确的向数组中添加数据。 如图&#xff1a; 功能需求&#xff1a;1.每次点击添加新规格时&#xff0c;批量设置会多出来一行表格和一个标题输入框。 最…...

智创 AI 新视界 -- AIGC 重塑广告行业的创新力量(16 - 7)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

Runloop

假设你的项目中有关tableView&#xff0c;然后还有一个定时器timer在执行&#xff0c;定时器代码如下&#xff1a; var num 0override func viewDidLoad() {super.viewDidLoad()let timer Timer(timeInterval: 1,target: self,selector: #selector(self.run),userInfo: nil,r…...

代码随想录第40天

121. 买卖股票的最佳时机 class Solution:def maxProfit(self, prices: List[int]) -> int:cost, profit float(inf), 0for price in prices:cost min(cost, price)profit max(profit, price - cost)return profit122.买卖股票的最佳时机II class Solution:def maxPr…...

element plus table组件多选获取数据id

首先给table加上 selection-change"handleSelectionChange"事件 示例 <el-table selection-change"handleSelectionChange" stripe:data"data?.slice((currentPage3 - 1) * pageSize3, currentPage3 * pageSize3)" style"width: 100%…...

自动驾驶:百年演进

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…...

STM32 了解OLED

内容扩展 调试方式串口调试&#xff1a;通过串口调试&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印到显示屏上 keil调试模式&#xff1a;借助Keil软件的调试模式&a…...

NanoLog起步笔记-7-log解压过程初探

nonolog起步笔记-6-log解压过程初探 再看解压过程建立调试工程修改makefile添加新的launch项 注&#xff1a;重新学习nanolog的README.mdPost-Execution Log Decompressor 下面我们尝试了解&#xff0c;解压的过程&#xff0c;是如何得到文件头部的meta信息的。 再看解压过程 …...