阿格雷 發表於 2025-11-5 10:47:12

redis string实现共享会话和手机验证码应用场景

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">共享会话</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">实现思路</a></li></ul><li><a href="#_label1">手机验证码</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_1">实现思路</a></li><li><a href="#_lab2_1_2">伪代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_1_2_0">生成验证码</a></li><li><a href="#_label3_1_2_1">验证验证码</a></li></ul></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>共享会话</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><p class="maodian"><a name="_lab2_1_1"></a></p><h3>实现思路</h3>
<p>如果每个应用服务器,维护自己的会话数据,此时彼此之间胡共享,用户请求访问到不同的服务器上,就可能会出现一些不能正确处理的情况了</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025110510445772.png" /></p>
<p>为了解决这个问题,可以使用 <code>Redis</code> 将用户的 <code>Session</code> 信息进行几种管理,在这种模式下,只要保证 <code>Redis</code> 是最高可用和可扩展性的,无论用户被均衡到哪台 <code>Web</code> 服务器上,都集中从 <code>Redis</code> 中查询、更新 <code>Session</code> 信息!</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025110510445759.png" /></p>
<p class="maodian"><a name="_label1"></a></p><h2>手机验证码</h2>
<h3>实现思路</h3>
<ol><li><p>生成验证码</p>
<ul><li>用户输入手机号</li><li>点击获取验证码(限制:1min 之内,最多获取 5 次)</li></ul></li><li><p>检查验证码</p>
<ul><li>把短信收到的验证码这一串数,提交到系统中,验证是否正确</li></ul></li></ol>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>伪代码实现</h3>
<p class="maodian"><a name="_label3_1_2_0"></a></p><h4>生成验证码</h4>
<div class="jb51code"><pre class="brush:java;">String 发送验证码(phoneNumber) {
        key = "shortMsg:limit:" + phoneNumber;
        // 设置过期时间为 1 min
        //使用 NX,只在不存在 key 时才能设置成功
        bool r = Redis 执行命令: set key 1 ex 60 nx
        if (r == false) {
                // 说明之前设置过该手机的验证码了
                long c = Redis 执行命令: incr key
                if (c &gt; 5) {
                        // 说明超过一分钟 5 次的限制了
                        // 限制发送
                        return null;
                }
        }
       
        // 说明要么之前没有设置过手机验证码;要么次数没有超过 5 次
        String validationCode = 生成随机的 6 位数的验证码();
       
        validationKey = "validation:" + phoneNumber;
        // 验证码 5 分钟内有效
        Redis 执行命令: set validationKey validationCode ex 300;
       
        // 返回验证码
        return vaildation;
}


</pre></div>
<p class="maodian"><a name="_label3_1_2_1"></a></p><h4>验证验证码</h4>
<div class="jb51code"><pre class="brush:java;">// 验证用户输入的验证码是否正确
bool 验证验证码(phoneNumber, vaildation) {
        vaildationKey = "vaildation:" + phoneNumber;
       
        String value = Redis 执行命令: get vaildationKey;
        if (value == null) {
                // 说明没有这个手机验证码记录,验证失败
                return false;
        }
       
        if (value == vaildationCode) {
                retrurn true;
        } else {
                return false;
        }
}
</pre></div>
<blockquote><p>像发送短信这样的操作,都是有专门的 SDK 来实现的(第三方提供的短信平台服务)(充值)</p></blockquote>
頁: [1]
查看完整版本: redis string实现共享会话和手机验证码应用场景