【redis】go+redis模拟验证码功能

【redis】go+redis模拟验证码功能,第1张

写在前面

在B站看redis教程,老师做了一个java+redis模拟验证码验证得功能。于是,我把它转换成了go来实现。

1.要求

1.每个手机每天只能发送3次验证码
2.每次接收得验证码2分钟内有效。

2.分析

1.对于要求1,我们可以每个手机号一天内发送得验证码次数
2.对于要求2,我们可以设置该验证码得过期时间为2min。

3.实现

1.连接数据库

var rdb *redis.Client
var codeKey string
 var ctx = context.Background()
func initClient()(err error)  {
	rdb = redis.NewClient(&redis.Options{
		Addr: "这里写自己虚拟机得ip地址、或者是本地得ip地址,视个人情况而定:6379",
		Password: "",
		DB: 0,
	})
	ctx,cancel := context.WithTimeout(context.Background(),5*time.Second)
	defer cancel()
	_,err = rdb.Ping(ctx).Result()
	return err
}

注意:博主使用得reids库

"github.com/go-redis/redis/v8"

2.生成验证码
这里采用随机数生成6位验证码

//  createCode 生成6位验证码
func createCode()(code string)  {
	rand.Seed(time.Now().Unix()) //设置随机种子
	code = fmt.Sprintf("%6v",rand.Intn(600000))
	return
}

3.统计当前手机请求验证码次数,将验证码存入redis库中

//  logic 用来处理请求部分
func logic(code,phone string) {
//	1.定义验证码和手机号的key的形式
	codeKey = "key"+code
	phoneKey := "key"+phone
//	2.查看用户发送验证码的数量
	ctn := rdb.Get(ctx,phoneKey).String()
//  ctn为零值的时候,说明该用户还没有发送过验证码
	if ctn == "" {
		rdb.Set(ctx, phoneKey, "1", time.Minute*60*24) //设置手机请求验证码的时间为一天。
	}
	ctn1,_ := strconv.ParseInt(ctn,10,32)
//  发送次数没有超过3次
	if ctn1 <= 2 {
		rdb.Incr(ctx,phoneKey)
	}else{
		fmt.Println("您今天发送的次数已经超过三次,不可再发送请求")
		return
	}
	
//	将验证码存入redis,设置过期时间为2分钟
	rdb.Set(ctx,codeKey,code,time.Minute*2)

4.判断用户输入得验证码是否正确

// isEquals 验证用户输入的验证码是否匹配
func isEquals(input string)bool {
	code := rdb.Get(ctx,codeKey).String()
	if code == input {
		return true
	}
	return false
}

5.主函数

//	1.初始化数据库
	e := initClient()
	if e != nil {
		fmt.Println("连接数据库失败")
		return
	}
//	2.生成验证码
	code := createCode()
//	3.将验证码存入redis,并统计当前用户请求验证码的次数
	phone := "18134567012"
	logic(code,phone)
//	4.判断用户输入的验证码是否正确
	input := "345612"
	res := isEquals(input)
	fmt.Println("res=",res)

6.redis库中内容

这个案例仅仅实现了一个模拟接收和发送得过程。但是练手也是够用了。仅供大家参考。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995322.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存