Redis从入门到精通-手机验证码

一、业务场景,需求

用户在手机端点击获取短信验证码,且用户一个手机号每天只能发三次短信,手机端接收到6位验证码,进行比较。

二、实现

1、6位随机数工具类

2、2个key 一个用来设置 1天时间,校验该手机号发送几次,一个key存验证码

三、代码

package com.mangoubiubiu;

import com.mangoubiubiu.utils.RandomUtils;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Set;

public class JedisTest {
    public static void main(String[] args) {
        //verifyCode("123123123123");
        checkCode("757178","13807369783");
    }
    //做验证码校验
    public static void checkCode(String code,String phone){
        Jedis jedis=new Jedis("192.168.117.134",6379);
        //验证码key
        String codeKey="verifyCode"+phone+":code";
        String s = jedis.get(codeKey);
        if(code.equals(s)){
            System.out.println("验证成功");
        }else {
            System.out.println("验证失败");
        }
    }


    public static void verifyCode(String phone){
        //创建Jedis对象
        Jedis jedis=new Jedis("192.168.117.134",6379);
        //拼接key
        //手机验证码key拼接
        String countKey="verifyCode"+phone+":count";
        //验证码key
        String codeKey="verifyCode"+phone+":code";

        //每个手机每天只能发生三次
        String count = jedis.get(countKey);
        if(count == null){
            //没有发送次数,第一次发送
            //设置发送次数是1
            jedis.setex(countKey,24*60*60,"1");
        }else if(Integer.parseInt(count)<=2){
            //发送次数+1
            jedis.incr(codeKey);
        }else if(Integer.parseInt(count)>2){
            //发送三次,不能再次进行发送
            System.out.println("不能发送,今天的发送次数已经超过三次。");
            jedis.close();
        }
        //发短信到redis里面
        String vcode= RandomUtils.getSixCode();
        System.out.println(vcode);
        jedis.setex(codeKey,120,vcode);
        jedis.close();
    }




}
package com.mangoubiubiu.utils;

import java.util.Random;

public class RandomUtils {

    /**
     * 禁用构造函数
     */
    private RandomUtils(){

    }


    /**
     * 生成6位数的随机验证码
     * @return
     */
    public static String getSixCode(){
        Random random=new Random();
        StringBuilder stringBuilder=new StringBuilder();
        for (int i=0;i<6;i++){
            //生成10以内的随机数
            int nums = random.nextInt(10);
            stringBuilder.append(nums);
        }
       return stringBuilder.toString();
    }
    
}

 

推荐这些文章:

Redis从入门到精通-Redis-事物和锁机制-秒杀案例-基本实现

一、需求
某个产品设置库存时,用户在前端页面点击秒杀按钮,库存数减一。

二、后台逻辑
1、用户id和产品id非空判断
2、通过连接池得到jedis对象3、拼接相关key,库存key 秒杀成功用户key
4、获取库存,如果库存为null则秒杀还未开始
5、通过用户key取val 判断用户操作是否重复秒杀
6、判断如果商品,库存数量小于1,秒杀结束
7、都过了上面的判断校验,正常秒杀
8、记录秒杀成功的用户方便第三步的判断

三、代码实现

package com.atguigu;

import java.io.IOException;
import java.util.HashSet...

Redis从入门到精通-Redis-事物和锁机制-超时和超卖问题解决

一、超卖问题

二、利用乐观锁淘汰用户,解决超卖问题。

三、代码

package com.atguigu;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Transaction;

import java.io.IOException;
import java.util.List;

/**
*
*/
public class SecKill_redis_advance {

public static void ma...

Redis从入门到精通-redis-集群的Jedis开发

package com.mangoubiubiu;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

public class JqJedisOperate {
public static void main(String[] args) {
HostAndPort hostAndPort = new HostAndPort("192.168.117.134", 6379); //集群随便连接哪个节点都行
JedisCluster j...

Redis相关操作

String数据类型
命令行

创建获取增减

192.168.1.103:6379> set online-users 50
OK
192.168.1.103:6379> set online-users 100
OK
192.168.1.103:6379> keys *

"online-users"

192.168.1.103:6379> get online-users
"100"
192.168.1.103:6379> incr online-users
(integer) 101
192.168.1.103:6379> decr onlin...

Redis 分布式锁

redis setnx命令是当key不存在时设置key但setnx不能同时完成expire设置失效时长,不能保证setnx和expire的原子性.因此可以采用set命令的可选项:set key value [EX seconds] [PX milliseconds] [NX|XX]EX seconds:设置失效时长,单位秒PX milliseconds:设置失效时长,单位毫秒NX:key不存在时设置value,成功返回OK,失败返回(nil)XX:key存在时设置value,成功返回OK,失败返回(nil)set name aa ex 100 nx
ttl 查看剩余过期时间代码package...

Redis入门到精通

Redis所有的命令都可以去官方网站查看
1.基本命令
keys *
查找所有符合给定模式pattern(正则表达式)的 key 。可以进行模糊匹配
del key1,key2,...
删除指定的一批keys,如果删除中的某些key不存在,则直接忽略。被删除的keys的数量
exists key
返回key是否存在。0:key不存在 1:key存在
EXPIRE key seconds
设置key的过期时间,超过时间后,将会自动删除该key。
TTL key
返回key剩余的过期时间。
-1:永不过期
-2:过期或不存在
type key
查看键的类型
Redis中的数据都是以"字符串"形...

Redis(四):后端开发使用redis

案例一

demo为chnx/springboot/redis01
创建springboot项目,导入redis依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

redis依赖中redis自动装配类为我们自动装配了jedis连接工厂和lettuce连接工厂

整合jedis,使用jedi...

Redis(三):新数据类型

配置文件redis.conf详解
bind=127.0.0.1 # 表示只能在本机中访问redis,将该行注释掉,即可接收任何IP地址的访问
protected-mode # 设置为no,表示关闭保护模式
timeout # 表示一个cli客户端多长时间没有操作时会关闭,设置为0表示永不关闭
tcp-keepalive # 表示多少秒会对客户端进行一次心跳检测

发布和订阅
publish <频道> <message> # redis作为发布者,向一个频...

第8章 Redis_Jedis_实例

8.1 完成一个手机验证码功能
要求:
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能输入3次

 

...

Redis删除相同前缀的key

直接撸demo

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clie...

文章标题:Redis从入门到精通-手机验证码
文章链接:https://www.dianjilingqu.com/4295.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>