【后端开发面试题】每日 3 题(六)

news/2025/3/6 22:27:42/

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:https://blog.csdn.net/newin2020/category_12903849.html
📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

1. 在 Spring Boot 中,如何实现定时任务?

在 Spring Boot 中实现定时任务有多种方式,这里主要介绍常用的两种:

使用 @Scheduled 注解

@Scheduled 是 Spring 框架提供的一个注解,可用于方法上,将该方法标记为定时任务。使用步骤如下:

  1. 在主应用类上添加 @EnableScheduling 注解,开启定时任务功能。
java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
  1. 创建一个组件类,在其中定义带有 @Scheduled 注解的方法。
java">import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class ScheduledTasks {// 固定延迟,上一次任务执行结束后,延迟 5000 毫秒执行下一次任务@Scheduled(fixedDelay = 5000) public void fixedDelayTask() {System.out.println("Fixed delay task executed.");}// 固定速率,每隔 3000 毫秒执行一次任务@Scheduled(fixedRate = 3000) public void fixedRateTask() {System.out.println("Fixed rate task executed.");}// 使用 cron 表达式,每天凌晨 2 点执行任务@Scheduled(cron = "0 0 2 * * ?") public void cronTask() {System.out.println("Cron task executed.");}
}

使用 SchedulingConfigurer 接口

如果需要更灵活地配置定时任务,可以实现 SchedulingConfigurer 接口。

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;import java.util.concurrent.Executor;
import java.util.concurrent.Executors;@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(taskExecutor());taskRegistrar.addFixedRateTask(() -> {System.out.println("Custom scheduled task executed.");}, 5000);}public Executor taskExecutor() {return Executors.newScheduledThreadPool(10);}
}

redis__88">2. redis 中,如何实现分布式锁

基本思路

  1. 使用 SET 命令设置一个特定的键值对,同时设置过期时间,确保即使持有锁的客户端崩溃,锁也能在一定时间后自动释放。
  2. 通过判断 SET 命令的返回结果来确定是否成功获取锁。
  3. 释放锁时,需要确保只有持有锁的客户端才能释放锁,通常使用 Lua 脚本来保证操作的原子性。

示例代码(Python + Redis)

python">import redis
import time# 连接 Redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)def acquire_lock(lock_name, acquire_timeout=10, lock_timeout=10):end_time = time.time() + acquire_timeoutwhile time.time() < end_time:# 使用 SET 命令尝试获取锁result = redis_client.set(lock_name, "locked", nx=True, ex=lock_timeout)if result:return Truetime.sleep(0.1)return Falsedef release_lock(lock_name):# 使用 Lua 脚本释放锁,保证操作的原子性lua_script = """if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])elsereturn 0end"""result = redis_client.eval(lua_script, 1, lock_name, "locked")return result# 使用示例
lock_name = "my_distributed_lock"
if acquire_lock(lock_name):try:print("获取到锁,开始执行任务...")time.sleep(5)  # 模拟任务执行finally:release_lock(lock_name)print("任务执行完毕,释放锁。")
else:print("未能获取到锁。")

3. 简述如何在 MySQL 中实现数据库备份与恢复

备份

  • 使用 mysqldump 工具(逻辑备份)

    mysqldump 是 MySQL 自带的一个命令行工具,可用于备份数据库、表或整个 MySQL 实例。

    • 备份单个数据库
      mysqldump -u username -p database_name > backup.sql
      
      其中,username 是 MySQL 用户名,database_name 是要备份的数据库名,执行该命令后会提示输入密码,输入正确密码后,会将指定数据库的结构和数据备份到 backup.sql 文件中。
  • 备份多个数据库

    mysqldump -u username -p --databases database1 database2 > backup.sql
    
  • 只备份数据库结构(不包含数据):

    mysqldump -u username -p --no-data database_name > structure_backup.sql
    
  • 物理备份

    可以直接复制 MySQL 数据目录下的文件来进行物理备份,但这种方法需要停止 MySQL 服务,且对文件的管理和恢复要求较高。一般适用于 InnoDB 存储引擎,可使用 xtrabackup 工具进行热备份。

恢复

  • 使用 mysql 命令恢复(逻辑备份恢复)

    如果之前使用 mysqldump 进行了备份,可以使用 mysql 命令将备份文件恢复到数据库中。

    mysql -u username -p database_name < backup.sql
    

    该命令会将 backup.sql 文件中的 SQL 语句执行,从而恢复数据库的结构和数据。

  • 物理备份恢复

    对于物理备份,需要将备份的文件复制到 MySQL 数据目录下,并根据具体情况进行配置和启动 MySQL 服务。如果使用 xtrabackup 进行备份,可使用其提供的恢复命令进行恢复。例如:

    xtrabackup --prepare --target-dir=/path/to/backup
    xtrabackup --copy-back --target-dir=/path/to/backup
    

http://www.ppmy.cn/news/1577190.html

相关文章

BambuStudio学习笔记:Extruder 类

Extruder 类文档 概述 Extruder 类用于管理3D打印过程中的挤出机状态&#xff0c;包括挤出量计算、回抽操作、耗材统计等功能。支持多挤出机配置及共享挤出机模式。 头文件 #ifndef slic3r_Extruder_hpp_ #define slic3r_Extruder_hpp_ // ... #endif成员函数 构造函数 E…

docker本地部署ollama

启动ollama容器 1.使用该命令启动CPU版运行本地AI模型 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 2.此命令用于启动GPU版本运行AI模型 前提是笔记本已配置NVIDIA的GPU驱动&#xff0c;可在shell中输入nvidia-smi查看详细情况…

安全渗透测试的全面解析与实践

引言 随着网络安全威胁的日益增加&#xff0c;企业和组织对自身系统的安全性提出了更高的要求。安全渗透测试&#xff08;Penetration Testing&#xff0c;简称渗透测试&#xff09;作为主动发现和修复系统安全漏洞的重要手段&#xff0c;已成为安全防护体系中的关键环节。本文…

JS基础之对象

对象使用 目标:掌握对象语法&#xff0c;用它保存多个数据 1.对象声明语法 let 对象名 {} let 对象名 new 0bject() 对象本质是无序的数据集合&#xff0c;操作数据无非就是 增 删 改 查 语法: 属性-查 声明对象&#xff0c;并添加了若干属性后&#xff0c;可以使用.获得…

市场趋势解析与交易策略优化

市场趋势解析与交易策略优化 在市场环境不断变化的情况下&#xff0c;理解市场趋势并优化交易策略是交易者稳健发展的关键。通过科学的方法识别市场动向&#xff0c;结合数据分析优化交易方案&#xff0c;可以提高交易效率并降低风险。本文将探讨趋势分析的要点&#xff0c;并介…

Tomcat 是什么?有什么功能和作用?为什么启动 Spring 或 Spring Boot 项目需要 Tomcat?

本文的内容是博主学习并记录关于 Tomcat 的基本知识&#xff0c;介绍了 Tomcat 为什么是一个 Web 应用服务器&#xff0c;为什么是 Servlet 容器&#xff0c;同时总结了 Tomcat 的一些功能原理&#xff0c;并详细介绍了 Tomcat 在 Spring 和SpringBoot 项目中的使用原理。本文不…

BambuStudio学习笔记:MeshBoolean类

# MeshBoolean.hpp 代码分析## 功能概述 本头文件提供三维网格布尔运算功能&#xff0c;支持差集、并集、交集操作。实现基于CGAL和Mcut两种底层库&#xff0c;包含数据结构转换、运算接口及辅助功能。## 核心结构### 数据结构 cpp using EigenMesh std::pair<Eigen::Matri…

windows 利用nvm 管理node.js 2025最新版

1.首先在下载nvm 下载链接 2. 下载最新版本的nvm 3. 同意协议 注意&#xff1a;选择安装路径 之后一直下一步即可 可以取消勾选 open with Powershell 勾选后它会自动打开Powershell 这里选用cmd 输入以下命令查看是否安装成功 nvm version 查看已经安装的版本 我之前自…