如何使用 Redis 缓存验证码
目录
🧠 Redis 缓存验证码的工作原理
🧰 实现流程
1. 安装 Redis 和 Python 客户端
2. 生成并缓存验证码
示例代码:生成并存储验证码
3. 发送验证码(以短信为例)
4. 校验验证码
示例代码:校验验证码
🔑 防刷策略与扩展
🌍 高级扩展
使用 Redis 缓存验证码是一个高效的防刷和防作弊的策略,它可以保证验证码在短时间内有效,并且防止重复提交或暴力破解。Redis 的高性能和过期时间机制使其非常适合用于验证码的存储和管理。
🧠 Redis 缓存验证码的工作原理
-
生成验证码:通常是一个随机的数字或字符串(如 6 位数字验证码
123456
)。 -
存储验证码:将生成的验证码存储到 Redis 中,并设置过期时间。
-
发送验证码:通过短信、邮件、WebSocket 等方式发送给用户。
-
校验验证码:用户输入验证码后,后端查询 Redis 存储的验证码并进行校验。如果验证码正确且未过期,验证通过。
-
清除过期验证码:Redis 会在验证码过期后自动删除缓存的验证码。
🧰 实现流程
1. 安装 Redis 和 Python 客户端
首先,确保已经安装了 Redis 服务,并且在本地或者云端运行。然后安装 Redis 的 Python 客户端:
pip install redis
2. 生成并缓存验证码
我们可以生成一个随机的 6 位数字验证码,并将其存入 Redis,设置过期时间为 5 分钟(300 秒)。
示例代码:生成并存储验证码
import random
import redis# 连接本地 Redis
r = redis.Redis(host='localhost', port=6379, db=0)# 生成 6 位随机验证码
def generate_code():return str(random.randint(100000, 999999))# 存储验证码到 Redis(设置过期时间为300秒)
def store_code(phone, code):key = f"code:{phone}" # 使用手机号作为 Redis keyr.setex(key, 300, code) # 300秒后自动过期# 测试:存储验证码并打印
phone = '13812345678'
code = generate_code()
store_code(phone, code)
print(f"存储验证码:{code},有效期:5分钟")
在这个例子中,我们生成了一个 6 位随机数字作为验证码,并将其存储在 Redis 中,使用手机号 phone
作为键(code:{phone}
)。然后,我们设置了验证码在 300 秒(5 分钟)后过期。
3. 发送验证码(以短信为例)
发送验证码的具体操作取决于你使用的服务。例如,假设你使用腾讯云短信 API 发送验证码,可以按照以下步骤进行:
# 使用腾讯云短信 API 发送验证码的简单示例
from tencentcloud.sms.v20210111 import sms_client, models
from tencentcloud.common import credentialdef send_sms(phone, code):cred = credential.Credential("你的SecretId", "你的SecretKey")client = sms_client.SmsClient(cred, "ap-guangzhou")req = models.SendSmsRequest()req.SmsSdkAppId = "1400XXXXXXX"req.SignName = "你的短信签名"req.TemplateId = "123456" # 验证码模板IDreq.TemplateParamSet = [code]req.PhoneNumberSet = [f"+86{phone}"]client.SendSms(req)# 发送验证码
send_sms(phone, code)
发送的验证码会存储在 Redis 中,用户通过短信获取验证码。
4. 校验验证码
当用户输入验证码后,你需要从 Redis 中取出该手机号的验证码进行验证。如果验证成功,则进行后续操作(如登录、注册等)。
示例代码:校验验证码
# 校验验证码
def verify_code(phone, user_input):key = f"code:{phone}"real_code = r.get(key) # 从 Redis 获取验证码if not real_code:return "验证码过期"if user_input != real_code.decode():return "验证码错误"# 验证成功,删除验证码r.delete(key) # 验证通过后删除验证码,防止再次使用return "验证通过"# 假设用户输入的验证码
user_input = '123456'
result = verify_code(phone, user_input)
print(result)
在这个代码中,我们首先从 Redis 获取存储的验证码,并与用户输入的验证码进行比对。如果匹配,则验证成功,之后我们删除 Redis 中的验证码,防止重复使用。
🔑 防刷策略与扩展
-
频率限制:同一个手机号或 IP 在短时间内不要频繁获取验证码。例如可以限制每个手机号 1 分钟内最多请求 1 次验证码。
-
验证码过期时间:验证码应该在较短时间内过期,避免用户重复使用过期的验证码。通常设置 5 分钟为有效期。
-
验证码存储方式:使用 Redis 的
setex
方法(设置过期时间)是最常见的方式,因为 Redis 会在过期后自动删除数据,减少了后台清理的工作。 -
添加验证码限制:为防止恶意刷验证码,可以在 Redis 中记录请求次数,超过一定次数后需要加入图形验证码,或者暂停请求。
-
Redis 集群支持:如果是大规模的系统,单个 Redis 实例可能不足以处理请求流量,可以考虑使用 Redis Cluster。
🌍 高级扩展
-
验证码带图片(图形验证码):结合 Redis 可以存储图形验证码的哈希值,确保图形验证码的有效性;
-
验证码冷却时间:例如,对于同一个手机号,如果短时间内请求了过多验证码,可以暂时阻止请求,防止滥用。
-
短信与图形验证码结合:对于频繁访问的接口,可以结合图形验证码与短信验证码,避免恶意刷接口。
-
多平台支持:通过短信、邮箱等方式发送验证码,可以将 Redis 存储的验证码同时与多个平台同步。
相关文章:
如何使用 Redis 缓存验证码
目录 🧠 Redis 缓存验证码的工作原理 🧰 实现流程 1. 安装 Redis 和 Python 客户端 2. 生成并缓存验证码 示例代码:生成并存储验证码 3. 发送验证码(以短信为例) 4. 校验验证码 示例代码:校验验证码…...
深度学习---框架流程
核心六步 一、数据准备 二、模型构建 三、模型训练 四、模型验证 五、模型优化 六、模型推理 一、数据准备:深度学习的基石 数据是模型的“燃料”,其质量直接决定模型上限。核心步骤包括: 1. 数据收集与标注 来源:公开数据集…...

业绩回暖、股价承压,三只松鼠赴港上市能否重构价值锚点?
在营收重返百亿俱乐部后,三只松鼠再度向资本市场发起冲击。 4月25日,这家坚果零食巨头正式向港交所递交上市申请书,若成功登陆港股,将成为国内首个实现“AH”双上市的零食品牌。 其赴港背后的支撑力,显然来自近期披露…...

JAVA-StringBuilder使用方法
JAVA-StringBuilder使用方法 常用方法 append(Object obj) 追加内容到末尾 sb.append(" World"); insert(int offset, Object obj) 在指定位置插入内容 sb.insert(5, “Java”); delete(int start, int end) 删除指定范围的字符 sb.delete(0, 5); replace(int start…...

【Python】Matplotlib:立体永生花绘制
本文代码部分实现参考自CSDN博客:https://blog.csdn.net/ak_bingbing/article/details/135852038 一、引言 Matplotlib作为Python生态中最著名的可视化库,其三维绘图功能可以创造出令人惊叹的数学艺术。本文将通过一个独特的参数方程,结合极…...

Unity AI-使用Ollama本地大语言模型运行框架运行本地Deepseek等模型实现聊天对话(一)
一、Ollama介绍 官方网页:Ollama官方网址 中文文档参考:Ollama中文文档 相关教程:Ollama教程 Ollama 是一个开源的工具,旨在简化大型语言模型(LLM)在本地计算机上的运行和管理。它允许用户无需复杂的配置…...
terraform使用vault动态管多理云账号AK/SK
为了使用 Terraform 和 HashiCorp Vault 动态管理多个云账号的 Access Key (AK) 和 Secret Key (SK),可以按照以下步骤实现安全、自动化的凭证管理: 一、架构概述 核心组件: Vault:存储或动态生成云账号的 AK/SK,提供…...

SAP /SDF/SMON配置错误会导致HANA OOM以及Disk Full的情况
一般来说,为了保障每日信息收集,每个企业都会配置/SDF/SMON的监控。这样在出现性能问题时,可以通过收集到的snapshot进行分析检查。如果/SDF/SMON在配置时选取了过多的记录项,或者选择了过低的时间间隔[Interval in seconds],那显…...

CMU和苹果公司合作研究机器人长序列操作任务,提出ManipGen
我们今天来介绍一项完成Long-horizon任务的一项新的技术:ManipGen。 什么叫Long-horizon?就是任务比较长。说到底,也是任务比较复杂。 那么这个技术就给我们提供了一个非常好的解决这类问题的思路,同时,也取得了不错的…...

大模型(LLMs)强化学习—— PPO
一、大语言模型RLHF中的PPO主要分哪些步骤? 二、举例描述一下 大语言模型的RLHF? 三、大语言模型RLHF 采样篇 什么是 PPO 中 采样过程?介绍一下 PPO 中 采样策略?PPO 中 采样策略中,如何评估“收益”? …...
[Python开发] 如何用 VSCode 编写和管理 Python 项目(从 PyCharm 转向)
在 Python 开发领域,PyCharm 一直是广受欢迎的 IDE,但其远程开发功能(如远程 SSH 调试)仅在付费版中提供。为了适应服务器部署需求,很多开发者开始将目光转向更加轻量、灵活且免费扩展能力强的 VSCode。本篇文章将详细介绍,从 PyCharm 转向 VSCode 后,如何高效搭建和管理…...

Maven多模块工程版本管理:flatten-maven-plugin扁平化POM
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...

视频汇聚平台EasyCVR赋能高清网络摄像机:打造高性价比视频监控系统
在现代视频监控系统中,高清网络摄像机作为核心设备,其性能和配置直接影响监控效果和整体系统的价值。本文将结合EasyCVR视频监控的功能,探讨如何在满足使用需求的同时,优化监控系统的设计,降低项目成本,并提…...

Unity 接入阿里的全模态大模型Qwen2.5-Omni
1 参考 根据B站up主阴沉的怪咖 开源的项目的基础上修改接入 AI二次元老婆开源项目地址(unity-AI-Chat-Toolkit): Github地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit Gitee地址:https://gitee.com/DammonSpace/unity-ai-chat-too…...

Nginx知识点
Nginx发展历史 Nginx 是由俄罗斯程序员 Igor Sysoev 开发的高性能开源 Web 服务器、反向代理服务器和负载均衡器 ,其历史如下: 起源与早期开发(2002 - 2004 年) 2002 年,当时 Igor Sysoev 在为俄罗斯门户网站 Rambl…...
NLP高频面试题(五十五)——DeepSeek系列概览与发展背景
大型模型浪潮背景 近年来,大型语言模型(Large Language Model, LLM)领域发展迅猛,从GPT-3等超大规模模型的崛起到ChatGPT的横空出世,再到GPT-4的问世,模型参数规模和训练数据量呈指数级增长。以GPT-3为例,参数高达1750亿,在570GB文本数据上训练,显示出模型规模、数据…...
详解 Unreal Engine(虚幻引擎)
详解 Unreal Engine(虚幻引擎) Unreal Engine(简称 UE)是由 Epic Games 开发的一款全球领先的实时渲染引擎,自 1998 年随首款游戏《Unreal》问世以来,已发展成为覆盖 游戏开发、影视制作、建筑可视化、汽车…...

Mysql从入门到精通day6————时间和日期函数精讲
关于Mysql的日期和时间计算函数种类非常繁多,此处我们对常用的一些函数的用法通过实例演示让读者体会他们的用法,文章末尾也给出了时间和日期计算的全部函数 函数1:curdate()和current_date()函数 作用:获取当前日期 select curdate(),current_date();运行效果:...

逻辑漏洞安全
逻辑漏洞是指由于程序逻辑不严导致一些逻辑分支处理错误造成的漏洞。 在实际开发中,因为开发者水平不一没有安全意识,而且业务发展迅速内部测试没有及时到位,所以常常会出现类似的漏洞。 由于开发者/设计者在开发过程中,由于代码…...

Github 热点项目 rowboat 一句话生成多AI智能体!5分钟搭建企业级智能工作流系统
今日高星项目推荐:rowboat凭借1705总星数成为智能协作工具黑马!亮点速递:①自然语言秒变AI流水线——只需告诉它“帮外卖公司处理配送异常”,立刻生成多角色协作方案;②企业工具库即插即用,Python包HTTP接口…...

(26)VTK C++开发示例 ---将点坐标写入PLY文件
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 本示例演示了将球体数据写入ply文件,并从ply文件读取显示; PLY 文件(Polygon Fil…...
32BIT的SPI主机控制
SPI传输位数可参数化配置。 SPI_MASTER: timescale 1ns / 1ps module SPI_Master #(parameter CLK_FREQ 50,parameter SPI_CLK 1000,parameter CPOL 0,parameter CPHA 0 )(input clk,input rst_n,input WrRdReq, //读/写数据请求output …...

2025蓝桥省赛c++B组第二场题解
前言 这场的题目非常的简单啊,至于为什么有第二场,因为当时河北正在刮大风被迫停止了QwQ,个人感觉是历年来最简单的一场,如果有什么不足之处,还望补充。 试题 A: 密密摆放 【问题描述】 小蓝有一个大箱子࿰…...

vue3 vite打包后动态修改打包后的请求路径,无需打多个包给后端
整体思路和需求 部署多个服务器环境的时候,需要多次打包很麻烦,所以需要打包之后动态的修改 1.创建一个webconfig文件夹 2.在自己封装的接口文件中 判断是否在生产环境,然后将数据保存到vuex 中 代码: // 创建axios服务的函数 …...

Nacos-SpringBoot 配置无法自动刷新问题排查
背景 Nacos SpringBoot版本中,提供了NacosValue注解,支持控制台修改值时,自动刷新,但是今天遇见了无法自动刷新的问题。 环境 SpringBoot 2.2.x nacos-client:2.1.0 nacos-config-spring-boot-starter:0…...

【RabbitMQ消息队列】详解(一)
初识RabbitMQ RabbitMQ 是一个开源的消息代理软件,也被称为消息队列中间件,它遵循 AMQP(高级消息队列协议),并且支持多种其他消息协议。 核心概念 生产者(Producer):创建消息并将其…...
FFmpeg之三 录制音频并保存, API编解码从理论到实战
在学习FFmpeg的时候,想拿demo来练习,官方虽有示例,但更像是工具演示,新手不好掌握,在网上找不到有文章,能给出完整的示例和关键点的分析说明,一步一个错误,慢慢啃过来的,…...
Kaamel白皮书:2025版COPPA落地实操指南
COPPA简介 《儿童在线隐私保护法案》(COPPA)于1998年在美国颁布,其最初的动因源于人们日益增长的对互联网上收集儿童个人信息的担忧。为了响应这一问题,联邦贸易委员会(FTC)被授权制定并执行相关法规。COP…...

Jenkins Pipeline 构建 CI/CD 流程
文章目录 jenkins 安装jenkins 配置jenkins 快速上手在 jenkins 中创建一个新的 Pipeline 作业配置Pipeline运行 Pipeline 作业 Pipeline概述Declarative PipelineScripted Pipeline jenkins 安装 安装环境: Linux CentOS 10:Linux CentOS9安装配置Jav…...
蓝桥杯 8. 移动距离
移动距离 原题目链接 题目描述 X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。楼房的编号为 1, 2, 3, ⋯⋯。 当排满一行时,从下一行相邻的楼往反方向排号。 例如,当小区排号宽度为 6 时,排列如下: 1 2 …...