Spring Boot如何利用Redis实现验证码限流与存储?

风宇酱_5122

风宇酱_5122

2026-08-15

426人浏览

原创

必须用stringredistemplate.opsforvalue().set()显式设过期时间,限流与验证码键须分离;手机号限流需分60秒时间戳键和24小时计数键;校验验证码应使用getanddelete保证一次性消费。

spring boot如何利用redis实现验证码限流与存储?

直接结论:必须用 StringRedisTemplate + opsForValue().set() 显式传入过期时间,不能用 RedisTemplate.set();限流和存储要分键设计,否则会相互干扰甚至误封用户。

为什么 RedisTemplate.set() 不能存带过期时间的验证码

这个方法签名是 set(K key, V value),没有 timeout 参数。你如果写了 redisTemplate.set("key", "123456"),它会存进去但不设 TTL,等同于永久有效(直到手动删或内存淘汰)。更隐蔽的问题是:如果你声明的是 RedisTemplate<string object></string>,value 是字符串却走 JDK 序列化,Redis 里看到的是乱码字节流,get() 返回 null 或报错。

  • 必须用 StringRedisTemplate(或显式配置 String 序列化器的 RedisTemplate
  • 存验证码只用这一行:stringRedisTemplate.opsForValue().set("login:code:138xxxx1234", "a7f9k", 5, TimeUnit.MINUTES)
  • 别依赖“自动过期”幻想——没显式传 TimeUnit,就等于没过期

手机号限流键怎么设计才不踩坑

限流目标不是“禁止发短信”,而是“防刷”:同一手机号 60 秒内最多发 1 次,24 小时最多 3 次。这两个维度必须拆开存,否则用一个 key 做 INCR 会把分钟级和日级计数混在一起。

Spring Boot 3.3.13
Spring Boot 3.3.13

Spring Boot下载页提供 3.3.13 官方源码 ZIP,并整理快速入门、项目创建、配置和自动配置说明。

下载
  • 60 秒间隔控制:sms:last_send:+8613812345678 存时间戳,EXPIRE 设为 60s,发前先 GET 判断是否距上次发送不足 60 秒
  • 24 小时频次限制:sms:count:day:+8613812345678INCR + EXPIRE(设 86400s),每次发完自增,超 3 就拒绝
  • 千万别把两个逻辑塞进同一个 key,比如 sms:limit:+86138... —— 你无法原子地同时更新时间和计数

校验验证码时要不要立刻删 key

只靠 TTL 不够。用户连续输错 5 次,每次校验都 GET 一次,Redis 承担了无效查询压力;更严重的是,如果验证码被截获重放,TTL 内还能反复用。

  • 推荐用 stringRedisTemplate.opsForValue().getAndDelete("login:code:138xxxx1234")
  • 它原子性完成“读取 + 删除”,确保一次性消费
  • 如果返回 null,说明已失效或不存在,直接拒绝登录,不用再查一遍
  • 注意:getAndDelete 返回的是 String,不是 Boolean,判空用 StringUtils.hasText() 而非 != null

IP 限流和手机号限流能共用一套逻辑吗

不能硬套。IP 是粗粒度防护(防脚本批量请求),手机号是细粒度业务控制(防用户自己刷),二者触发条件、阈值、惩罚方式都不同。

  • IP 限流 key 示例:sms:ip_limit:192.168.1.100,1 分钟最多 5 次,超限后直接 503
  • 手机号限流 key 示例:sms:phone_limit:+86138...,60 秒 1 次 + 24 小时 3 次,超限返回明确提示“今日已达上限”
  • 关键区别:IP 限流失败应快速失败(不进业务逻辑),手机号限流失败要给用户友好提示并记录日志

真正麻烦的不是写几行 Redis 命令,而是键命名规则、过期时间粒度、以及 get/delete 的原子性选择——这些细节一旦错位,轻则限流失效,重则误伤正常用户。别省那几行代码,每个键的用途和生命周期,得在注释里写清楚。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2091

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

377

25

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

3989

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3495

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6152

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

583

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

696

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5542

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1120

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习