Java/Kotlin 使用Redis模拟发送验证码
原文地址: Java/Kotlin 使用Redis模拟发送邮件验证码 - Stars-One的杂货小窝Java中常用语连接Redis的库有lettuce和jredis,一般是推荐lettuce,其具有异步性,下面两种都简单来使用如何实现功能
jredis
1.引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>脚本使用:
fun main() {
//1.测试连接
val jedis = Jedis("127.0.0.1", 6379)
val resp = jedis.ping()
//为pong即为可用的
if (resp == "PONG") {
val key = "mykey"
val value = "hello world"
//写入数据
jedis=value
//读数据
val result = jedis
println(result)
//删除指定key
val row = jedis.del(key)
//影响的行数
println(row)
//设置60s后过期
jedis.setex(key,60,value)
//设置60ms后过期
jedis.psetex(key,60,value)
//剩余的过期时间,ttl返回时间单位为s,pttl则是ms
val time = jedis.ttl(key)
val time = jedis.pttl(key)
}
}通过setex或psetex方法来设置过期时间后,当数据过期后,再次去查询该数据,就会得到null(即redis将数据删除了)
上述也是简单演示了redis数据库的增删改查功能,下面就利用此数据库来实现发送验证码的功能。
2.发送验证码
这里我是实现了邮箱发送验证码的功能,验证码定为6位纯数字随机数,当然,你也可以加上大小写字母来提高复杂性。
之后我们将邮箱和验证码存储到redis中,并设置十分钟过期时间,随后通过调用邮箱发送邮件的方法,将验证码发送出去(这里详见JavaXMail发送邮件功能实现)
下面是验证码生成方法:
//生成验证码fun randomCode(): String { val sb = StringBuffer() repeat(6) { //0-9范围 val num = Random.nextInt(0, 10) sb.append(num) } return sb.toString()}//发送验证码方法fun sendCode(email: String) { val code = randomCode() //先判断redis是否有记录 val oldCode = RedisUtil.getValue(email) val action = { RedisUtil.setKeyValue(email, code) //调用邮箱发送邮件方法 sendEmail(email, code) } if (oldCode.isBlank()) { action.invoke() } else { //判断是否已过1分钟 //已过一分钟,重新发送,否则不做操作 val flag = RedisUtil.isGtOneMinutes(email) if (flag) { action.invoke() } }}object RedisUtil { private val url = "127.0.0.1" //10分钟 private const val expiredTime = 10 * 60 private val redis by lazy { val jedis = Jedis(url, 6379) //如果有设置密码 // jedis.auth("") jedis } /** * 获取数据 */ fun getValue(key: String): String { return redis ?: "" } /** * 存储邮箱和验证码 */ fun setKeyValue(key: String, value: String) { redis.setex(key, 10 * 60, value) } /** * 获取指定key的剩余时间(s) */ fun getSurplusTime(key: String): Long { return redis.ttl(key) } /** * key是否已过1分钟 */ fun isGtOneMinutes(key: String): Boolean { val time = getSurplusTime(key) //小于九分钟(说明已过1分钟) return time
页:
[1]