一、前言
Redis 作为高性能的键值对数据库,在缓存、限流、分布式锁、验证码存储等场景中应用广泛。
二、Redis 环境搭建
1 安装 Redis(Windows 版本)
1. 解压安装包
将 Redis 安装包解压至指定目录(如 D:\redis),解压后目录包含核心文件:
redis-server.exe:Redis 服务端程序redis-cli.exe:Redis 客户端程序redis.windows.conf:Redis 配置文件
2. 启动 Redis 服务
打开命令提示符(CMD),切换至 Redis 解压目录,执行启动命令:
XML
redis-server.exe redis.windows.conf
3. 验证启动成功
打开新的 CMD 窗口,执行客户端连接命令:
redis-cli.exe -h 127.0.0.1 -p 6379
输入 ping,返回 PONG 则表示 Redis 服务启动正常。
三、Redis 知识点
1 Redis 特性
- 高性能:基于内存存储,单线程模型避免线程切换开销,QPS 可达 10W+
- 原子性 :所有命令都是原子操作(如
INCR/SET),适合高并发场景(如点赞计数、验证码存储) - 过期策略:支持为键设置过期时间,天然适配验证码、限流等临时数据存储场景
- 丰富的数据类型 :核心使用字符串(String)类型实现验证码存储,其他常用类型:
- 哈希(Hash):存储对象属性(如用户信息)
- 列表(List):实现简单队列
- 集合(Set):去重、交集 / 并集操作(如好友推荐)
2 Java 操作 Redis 的核心依赖
在 Maven 项目的 pom.xml 中引入Jedis依赖
XML
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.9.0</version>
</dependency>
</dependencies>
3 RedisUtil 工具类实现
封装 Redis 字符串类型的核心操作,适配验证码存储场景:
java
package com.qcby;
import redis.clients.jedis.Jedis;
/**
* 所有操作redis的,都可以走这个Util,当成自己的方法
*
* @author cong
* @date 2026/03/08
*/
public class RedisUtil {
public static Jedis jedis = new Jedis("localhost");
/**
* 设置 key, value
*
* @param key 键
* @param value 值
* @param time 过期时间,单位是秒,为null的时候,则代表永不过期
*/
public static void setStrKey(String key, String value, Integer time) {
jedis.set(key, value);
if (time != null) {
jedis.expire(key, time);
}
}
/**
* 根据key获取value
* @param key 键
* @return 对应的值
*/
public static String getStrKey(String key) {
return jedis.get(key);
}
}
四、短信验证码登录功能实现
1 业务接口LoginService.java
java
package com.qcby;
/**
* 做登录相关的接口
*
* @author cong
* @date 2026/03/08
*/
public interface LoginService {
/**
* 发送手机验证码
*
* @param phone 手机号
* @param code 验证码
*/
void sendSms(String phone, String code);
/**
* 登录
*
* @param phone 手机号
* @param code 验证码
*/
void login(String phone, String code);
}
2 接口实现类LoginServiceImpl.java
基于 Redis 实现限流、验证码存储、登录校验逻辑
java
package com.qcby;
public class LoginServiceImpl implements LoginService {
@Override
public void sendSms(String phone, String code) {
if(RedisUtil.getStrKey(phone) != null){
System.out.println("请勿频繁发送验证码");
return;
}
//第一步:需要放入redis,并且设置过期时间
RedisUtil.setStrKey(phone, code, 60);
//第二步:模拟发送短信
System.out.println("发送短息:手机号是" + phone + " 验证码为" + code);
}
@Override
public void login(String phone, String code) {
String value = RedisUtil.getStrKey(phone);
if(value == null){
System.out.println("验证码已过期,请重新获取");
return;
}
if(!value.equals(code)){
System.out.println("输入验证码有误,请重新输入");
return;
}
System.out.println("登陆成功");
}
}
3 逻辑
1 RedisUtil
- 静态
Jedis实例:全局唯一连接,直接连接本机 Redis setStrKey:存储键值对 + 可选过期时间(验证码场景设置 60 秒)getStrKey:根据键获取值(校验验证码时读取)
2 LoginServiceImpl
sendSms 方法(发送验证码)
- 通过
RedisUtil.getStrKey(phone)判断是否已发送(键存在则禁止重复发送) RedisUtil.setStrKey(phone, code, 60)存入 Redis 并设置 60 秒过期- 模拟发送,打印短信发送日志
login 方法(登录校验)
value == null表示验证码已过期(Redis 键过期 / 不存在)!value.equals(code)表示验证码输入错误- 以上校验均通过,打印「登陆成功」
五、功能测试
1 运行Main类测试发送短信,登录校验
java
package com.qcby;
public class Main {
public static void main(String[] args) {
String phone = "17778884374";
String code = "123456";
//模拟发送验证
LoginService loginService = new LoginServiceImpl();
loginService.sendSms(phone, code);
//模拟重复发送
loginService.sendSms(phone, code);
//模拟登陆
loginService.login(phone, "34534534534");
loginService.login("42342342", "34534534534");
loginService.login("17778884374", "123456");
}
}
输出结果:
java
发送短息:手机号是17778884374 验证码为123456
请勿频繁发送验证码
输入验证码有误,请重新输入
验证码已过期,请重新获取
登陆成功
六、总结
Redis 基础:高性能、原子性、过期策略是支撑验证码场景的核心特性
工具类封装:RedisUtil 简化了 Redis 字符串操作,提升代码复用性
业务逻辑:
发送短信:通过 Redis 实现 60 秒限流,避免验证码滥用;
登录校验:利用 Redis 过期策略自动失效验证码,保证安全性;
Redis 作为 Java 开发的核心中间件,除验证码场景外,还可拓展至点赞计数、缓存、分布式锁等场景。