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

Mysql-定时删除数据库中的验证码

Moudle 1 使用调度器+定时删除事件

数据库实现验证码自动删除的解决方案

-- 删除旧事件(如果存在)
DROP EVENT IF EXISTS delete_expired_captchas;-- 创建新事件(每分钟执行一次)
CREATE EVENT delete_expired_captchas
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
COMMENT '每分钟清理过期验证码'
DO
DELETE FROM captcha 
WHERE created_at < NOW() - INTERVAL 10 MINUTE;

1. 核心思路

数据库本身没有直接的「自动删除过期数据」的功能,但可以通过以下两种方式模拟实现:

  • 数据库事件调度器(如MySQL的Event Scheduler):定期执行删除过期数据的SQL语句。
  • 应用层逻辑:在验证时检查时间差,并在发现过期时删除记录(被动删除)。

2. 具体实现方法

方法一:使用数据库事件调度器(以MySQL为例)
步骤 1:启用事件调度器

默认情况下,MySQL的事件调度器是关闭的。需在配置文件中启用:

-- 检查事件调度器状态
SHOW VARIABLES LIKE 'event_scheduler';-- 启用事件调度器(临时生效)
SET GLOBAL event_scheduler = ON;-- 永久生效需修改配置文件 my.cnf:
[mysqld]
event_scheduler = ON
步骤 2:创建定时删除事件

创建一个每天自动清理过期验证码的事件:

CREATE EVENT delete_expired_captchas
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP
DO
DELETE FROM captcha 
WHERE created_at < NOW() - INTERVAL 10 MINUTE;
步骤 3:验证事件执行
-- 查看事件状态
SHOW EVENTS;-- 手动触发事件(测试用)
CALL delete_expired_captchas;
优缺点
  • 优点:完全由数据库管理,无需应用层干预。
  • 缺点
    • 删除操作是周期性的(如每天一次),不能实时删除过期数据。
    • 高频清理可能影响数据库性能。

方法二:应用层逻辑删除(被动删除)

在验证验证码时,检查时间差并删除过期记录:

@Service
public class DatabaseCaptchaService {@Autowiredprivate JdbcTemplate jdbcTemplate;public boolean validateCaptcha(String key, String userInput) {// 查询验证码及生成时间String sql = "SELECT code, created_at FROM captcha WHERE id = ?";return jdbcTemplate.query(sql, (rs) -> {if (rs.next()) {String storedCode = rs.getString("code");Timestamp createdAt = rs.getTimestamp("created_at");long age = System.currentTimeMillis() - createdAt.getTime();if (age > 10 * 60 * 1000) { // 超过10分钟// 删除过期记录jdbcTemplate.update("DELETE FROM captcha WHERE id = ?", key);return false;}return storedCode.equals(userInput);}return false;}, key);}
}
优缺点
  • 优点:实时删除过期数据,无需额外配置数据库事件。
  • 缺点
    • 依赖业务逻辑触发删除操作,可能遗留未验证的过期数据。
    • 需要手动调用删除逻辑。

3. 完整方案推荐

结合两种方式实现高可靠性:

  1. 应用层逻辑删除:在验证时主动清理过期验证码。
  2. 数据库事件调度器:每日清理残留的过期数据(兜底)。

4. 其他数据库的支持情况

  • PostgreSQL:通过pg_cron扩展或定时任务工具(如cron)实现类似功能。
  • SQL Server:使用SQL Server Agent创建定时作业。
  • SQLite:无内置事件调度器,需依赖应用层逻辑删除。

5. 对比Redis方案

特性

数据库方案

Redis方案

自动删除

需配置事件调度器或应用层逻辑

内置TTL,自动删除

实时性

依赖清理频率(非实时)

实时删除

性能

高频清理可能影响性能

高性能,无额外开销

适用场景

无Redis环境或低频验证码场景

高并发、实时性要求高的场景


6. 最终结论

可以通过数据库实现验证码的自动删除,但需权衡实时性和性能。

  • 推荐方案:优先使用Redis(简单高效),若无Redis则使用数据库事件调度器+应用层逻辑删除的组合方案。

关键代码示例

-- 创建每日清理事件(MySQL)
CREATE EVENT delete_expired_captchas
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM captcha 
WHERE created_at < NOW() - INTERVAL 10 MINUTE;

Moudle 2 问题解决

-- 创建一个每天自动清理过期验证码的事件: CREATE EVENT delete_expired_captchas ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP DO DELETE FROM captcha WHERE created_at < NOW() - INTERVAL 10 MINUTE;10分钟没生效。原因排查

解决方案:调整事件调度器设置以自动清理过期验证码

以下是分步说明,确保事件每天自动执行并持续生效:


1. 确认MySQL事件调度器已启用

执行以下SQL命令检查事件调度器状态:

SHOW VARIABLES LIKE 'event_scheduler';

如果结果为 OFF,需启用调度器:

  • SET GLOBAL event_scheduler = ON; -- 临时生效

永久生效需修改MySQL配置文件(如 my.cnf/my.ini):

  • ini
[mysqld]
event_scheduler = ON

修改后重启MySQL服务。


2. 修正事件调度时间间隔

原事件设置为每天执行一次(EVERY 1 DAY),但过期验证码需在生成10分钟后删除,因此需提高执行频率。
推荐方案:每分钟执行一次(实时清理):

-- 删除旧事件(如果存在)
DROP EVENT IF EXISTS delete_expired_captchas;-- 创建新事件(每分钟执行一次)
CREATE EVENT delete_expired_captchas
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
COMMENT '每分钟清理过期验证码'
DO
DELETE FROM captcha 
WHERE created_at < NOW() - INTERVAL 10 MINUTE;

3. 验证事件状态

查看事件列表

  1. SHOW EVENTS FROM your_database_name; -- 替换为实际数据库名
    • 确保事件状态为 ENABLED

手动触发测试

  1. CALL delete_expired_captchas;
    • 检查表中数据是否被删除。

4. 检查权限和语法

权限要求:用户需具备 EVENT 权限。授权命令:

  • GRANT EVENT ON your_database.* TO 'your_user'@'localhost';
  • 语法检查:确保SQL语句无拼写错误(如表名、字段名正确)。

5. 处理时区问题

如果数据库时区与系统时区不一致,可能导致时间计算错误。

查看当前时区

  • SELECT @@global.time_zone, @@session.time_zone;

设置时区(例如设为东八区):

SET GLOBAL time_zone = '+8:00';
SET time_zone = '+8:00';

6. 监控事件执行日志

查看MySQL错误日志(路径通常在 /var/log/mysql/error.log):

  • tail -f /var/log/mysql/error.log
  • 日志中若出现 Event Scheduler 相关记录,表示事件正在运行。

7. 最终效果验证

插入测试数据

INSERT INTO captcha (id, code, created_at)
VALUES ('test', '123456', NOW() - INTERVAL 11 MINUTE);

等待1分钟后检查数据

  1. SELECT * FROM captcha WHERE id = 'test';
  • 数据应被自动删除。

总结

通过以上步骤,事件将每分钟执行一次,确保所有超过10分钟的验证码被实时清理。
关键点:

  • 事件调度器必须启用。
  • 执行频率需足够高(推荐每分钟一次)。
  • 权限、时区、语法需正确配置。

相关文章:

Mysql-定时删除数据库中的验证码

Moudle 1 使用调度器定时删除事件 数据库实现验证码自动删除的解决方案 -- 删除旧事件&#xff08;如果存在&#xff09; DROP EVENT IF EXISTS delete_expired_captchas;-- 创建新事件&#xff08;每分钟执行一次&#xff09; CREATE EVENT delete_expired_captchas ON SCHE…...

容器安全最佳实践:云原生环境下的零信任架构实施

&#x1f4cb; 目录 引言&#xff1a;容器安全的重要性零信任架构基础理论云原生环境的安全挑战容器安全威胁模型分析零信任架构在容器环境中的实施关键技术组件与工具安全策略与最佳实践监控与响应机制案例研究与实施路径未来发展趋势 引言 随着容器技术和云原生架构的快速…...

[BIOS]VSCode zx-6000 编译问题

前提&#xff1a;Python 3.6.6及以上版本安装成功&#xff0c;Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题&#xff1a;添加环境变量 1&#xff1a;出现环境变量错误&#xff0c;“py -3” is not installed or added to environment variables #先在C:\Windows里…...

MySQL连接报SSL错误

问题&#xff08;cmd&#xff09; C:\Users>mysql -h xx.xx.xx.xx -u root -p Enter password: ERROR 2026 (HY000): SSL connection error: error:0A000102:SSL routines::unsupported protocol 解决方案 1. 临时禁用 SSL 连接&#xff08;不推荐生产环境使用&#xff0…...

在WPF项目中集成Python:Python.NET深度实战指南

随着Python在数据分析、机器学习、自动化等领域的广泛应用&#xff0c;越来越多的.NET开发者希望在WPF桌面应用中调用Python代码&#xff0c;实现两者优势互补。Python.NET&#xff08;pythonnet&#xff09;作为连接.NET与Python的桥梁&#xff0c;提供了强大的跨语言调用能力…...

Nuxt.js 布局系统详解:构建可复用页面框架

Nuxt.js 是一个基于 Vue.js 的强大框架&#xff0c;旨在简化开发流程并提高项目的可维护性。布局系统是 Nuxt.js 项目结构中的一个重要组成部分&#xff0c;它位于 layouts 目录下&#xff0c;帮助开发者实现页面间的统一风格和结构复用。 什么是 Nuxt.js 布局系统 Nuxt.js 提…...

CICD实战(二)-----gitlab的安装与配置

1、安装gitlab所需要的依赖包与工具 sudo yum install wget net-tools sudo yum install curl policycoreutils openssh-server openssh-clients postfix -y 2、配置清华源 vim /etc/yum.repo.d/gitlab-ce.repo[gitlab-ce] namegitlab-ce baseurlhttp://mirrors.tuna.tsin…...

[GitHub] 优秀开源项目

1 工具类 1.1 桌面猫咪互动 BongoCat...

Linux中su与sudo命令的区别:权限管理的关键差异解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析LLP (二)

低层协议&#xff08;Low Level Protocol, LLP&#xff09;详细解析 1. 低层协议&#xff08;Low Level Protocol, LLP&#xff09;核心特性 包基础 &#xff1a;基于字节的包协议&#xff0c;支持 短包 &#xff08;32位&#xff09;和 长包 &#xff08;可变长度&#xff0…...

第4天:RNN应用(心脏病预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &#xff08;二&#xff09;具体步骤…...

Python训练day40

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中 展平操作&#xff1a;除第一个维度batchsize外全部展平 dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练…...

湖北理元理律师事务所:债务优化中的民生保障实践

在债务纠纷数量年增21%&#xff08;2023年最高人民法院数据&#xff09;的背景下&#xff0c;法律服务机构如何平衡债务清偿与民生保障&#xff0c;成为行业重要课题。湖北理元理律师事务所通过“法律金融心理”三维服务模式&#xff0c;探索出一条可持续的债务化解路径。 一、…...

Vue-Todo-list 案例

一、前言 在前端开发中&#xff0c;Todo List&#xff08;待办事项列表&#xff09; 是一个非常经典的入门项目。它涵盖了组件化思想、数据绑定、事件处理、本地存储等核心知识点&#xff0c;非常适合用来练习 Vue 的基本用法。 本文将带你一步步实现一个功能完整的 Vue Todo…...

GIC700概述

GIC-700是用于处理外设与处理器核之间&#xff0c;以及核与核之间中断的通用中断控制器。GIC-700支持分布式微体系结构&#xff0c;其中包含用于提供灵活GIC实现的几个独立块。 GIC700支持GICv3、GICv3.1、GICv4.1架构。 该微体系结构规模可从单核到互联多chip环境&#xff0…...

动静态库的使用(Linux)

1.库 通俗来说&#xff0c;库就是现有的&#xff0c;可复用的代码&#xff0c;例如&#xff1a;在C/C语言编译时&#xff0c;就需要依赖相关的C/C标准库。本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。通常我们可以在windows下看到一些后…...

Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析

你可能会认为&#xff1a;用了跨平台框架&#xff08;如 Flutter 或 React Native&#xff09;&#xff0c;开发效率提高了&#xff0c;发布流程也该更轻松才对。 但当我第一次要将一个 Flutter 项目发布到 App Store 时&#xff0c;现实给了我一巴掌&#xff1a; “没有 Mac&…...

统信桌面专业版如何使用python开发平台jupyter

哈喽呀&#xff0c;小伙伴们 最近有学员想了解在统信UOS桌面专业版系统上开发python程序&#xff0c;Anaconda作为python开发平台,anaconda提供图形开发平台,提供大量的开发插件和管理各种插件的平台&#xff0c;但是存在版权问题&#xff0c;有没有其他工具可以替代Anaconda呢…...

移除元素-JavaScript【算法学习day.04】

题目链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 第一种思路 标签&#xff1a;拷贝覆盖 主要思路是遍历数组 nums&#xff0c;每次取出的数字变量为 num&#xff0c;同时设置一个下标 ans 在遍历过程中如果出现数字与需要移除的值不相同时&#xff…...

Android 相对布局管理器(RelativeLayout)

俩重要属性 android:gravity android:ignoreGravity Android 相对布局管理器&#xff1a;自由排列的魔法布局 想象一下&#xff0c;你是一个室内设计师&#xff0c;需要在一个房间里摆放家具。RelativeLayout&#xff08;相对布局&#xff09;就像是一个 "自由摆放"…...

DuckDB + Spring Boot + MyBatis 构建高性能本地数据分析引擎

DuckDB 是一款令人兴奋的内嵌式分析型数据库 (OLAP)&#xff0c;它为本地数据分析和处理带来了前所未有的便捷与高效 &#x1f680;。它无需外部服务器&#xff0c;可以直接在应用程序进程中运行&#xff0c;并提供了强大的 SQL 支持和列式存储带来的高性能。 什么是 DuckDB&am…...

什么是预训练?深入解读大模型AI的“高考集训”

1. 预训练的通俗理解&#xff1a;AI的“高考集训” 我们可以将预训练&#xff08;Pre-training&#xff09; 形象地理解为大模型AI的“高考集训”。就像学霸在高考前需要刷五年高考三年模拟一样&#xff0c;大模型在正式诞生前&#xff0c;也要经历一场声势浩大的“题海战术”…...

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好&#xff0c;仓颉语言商城应用的开发进程已经过半&#xff0c;不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面&#xff1a; 看到这个页面&#xff0c;我们首先要对它简单的分析一下。这个页面一共分为三部分&#xff0c;分别是…...

OPENCV的AT函数

一.AT函数介绍 在 OpenCV 中&#xff0c;at&#xff08;&#xff09; 是一个模板成员函数&#xff0c;用于访问和修改矩阵或图像中特定位置的元素。它提供了一种直接且类型安全的方式来操作单个像素值&#xff0c;但需要注意其性能和类型匹配问题 AT函数是OPENCV中重要的函数…...

【走好求职第一步】求职OMG——见面课测验4

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01;博主码字不易点个关注吧~~ 1.单选题(2分) 下列不属于简历撰写技巧原则的是&#xff08; A &#xff09; A.具体性 B.相关性 C.匹配性 2.单选题(2分) 笔试的下一步一般是:( B &…...

ISO 17387——解读自动驾驶相关标准法规(LCDAS)

Intelligent transport systems — Lane change decision aid systems (LCDAS) — Performance requirements and test procedures(First edition: 2008-05-01) 原文链接&#xff1a;https://cdn.standards.iteh.ai/samples/43654/701fd49bde7b4d3db165444b7c6f0c53/ISO-17387…...

智慧零售管理中的客流统计与属性分析

智慧零售管理中的视觉分析技术应用 一、背景与需求 随着智慧零售的快速发展&#xff0c;传统零售门店面临管理效率低、安全风险高、客户体验差等问题。通过视觉分析技术&#xff0c;智慧零售管理系统可实现对门店内人员行为的实时监控与数据分析&#xff0c;从而提升运营效率…...

Ps:Adobe PDF 预设

Ps菜单&#xff1a;编辑/Adobe PDF 预设 Edit/Adobe PDF Presets 通过“Adobe PDF 预设” Adobe PDF Presets对话框&#xff0c;可以查看 Adobe PDF 预设&#xff0c;了解复杂的 PDF 设置。还可以编辑、新建、删除、载入预设&#xff0c;根据最终用途&#xff08;如高质量打印、…...

Python Excel 文件处理:openpyxl 与 pandas 库完全指南

在数据处理和分析过程中&#xff0c;Excel 文件是最常见的数据存储格式之一。Python 提供了多个库来处理 Excel 文件&#xff0c;其中 openpyxl 和 pandas 是最常用的两个库。它们各自有独特的优势&#xff0c;适用于不同的需求。本文将详细介绍如何使用这两个库来处理 Excel 文…...

九、【ESP32开发全栈指南: UDP通信服务端】

一、TCP与UDP核心差异 特性TCPUDP连接方式面向连接 (需三次握手)无连接可靠性可靠传输 (重传/排序/校验)尽力交付 (不保证可靠性)实时性延迟较高低延迟&#xff0c;实时性强传输效率协议开销大头部开销小 (仅8字节)连接类型点对点支持广播/多播资源占用高 (需维护连接状态)极低…...