Redis 安装+基于短信验证码登录功能的完整实现

一、前言

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 特性

  1. 高性能:基于内存存储,单线程模型避免线程切换开销,QPS 可达 10W+
  2. 原子性 :所有命令都是原子操作(如 INCR/SET),适合高并发场景(如点赞计数、验证码存储)
  3. 过期策略:支持为键设置过期时间,天然适配验证码、限流等临时数据存储场景
  4. 丰富的数据类型 :核心使用字符串(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

  1. 静态 Jedis 实例:全局唯一连接,直接连接本机 Redis
  2. setStrKey:存储键值对 + 可选过期时间(验证码场景设置 60 秒)
  3. getStrKey:根据键获取值(校验验证码时读取)

2 LoginServiceImpl

sendSms 方法(发送验证码)

  1. 通过 RedisUtil.getStrKey(phone) 判断是否已发送(键存在则禁止重复发送)
  2. RedisUtil.setStrKey(phone, code, 60) 存入 Redis 并设置 60 秒过期
  3. 模拟发送,打印短信发送日志

login 方法(登录校验)

  1. value == null 表示验证码已过期(Redis 键过期 / 不存在)
  2. !value.equals(code) 表示验证码输入错误
  3. 以上校验均通过,打印「登陆成功」

五、功能测试

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 开发的核心中间件,除验证码场景外,还可拓展至点赞计数、缓存、分布式锁等场景。

相关推荐
Anastasiozzzz2 小时前
深入研究Redis的ZSet底层数据结构:从 Ziplist 的级联更新到 Listpack 的完美救场
数据结构·数据库·redis
菠萝蚊鸭2 小时前
x86 平台使用 buildx 基于源码构建 MySQL Wsrep 5.7.44 镜像
数据库·mysql·galera·wsrep
※DX3906※3 小时前
Java排序算法--全面详解面试中涉及的排序
java·开发语言·数据结构·面试·排序算法
笨笨马甲3 小时前
Qt QSS使用指南
开发语言·qt
cur1es4 小时前
【JVM类加载&双亲委派模型&垃圾回收机制】
java·jvm·gc·垃圾回收·类加载·双亲委派模型
Mr.朱鹏4 小时前
JVM-GC垃圾回收案例
java·jvm·spring boot·算法·spring·spring cloud·java-ee
焦糖玛奇朵婷4 小时前
实测扭蛋机小程序:开发简单,互动有趣
java·大数据·程序人生·小程序·软件需求
Nan_Shu_6144 小时前
学习: 尚硅谷Java项目之小谷充电宝(3)
java·后端·学习
沙漏无语4 小时前
(二)TIDB搭建正式集群
linux·数据库·tidb