4 回答
TA贡献1796条经验 获得超10个赞
设置一个有效期长量,如 120 秒
用户申请短信验证码
服务端根据用户的手机号创建记录:创建时间、手机号、验证码、激活状态(默认为否)
提交第 3 方短信平台(如果有必要等结果再对条目的状态做标记,那就另说)
用户提交验证,服务端读取『手机号+验证码』及创建时间倒序的第 1 条,,
过期,直接驳回
没过期,继续下面的业务,将数据库里条目状态标记为已激活
如不存在,直接驳回(可能被删了,也可能是手机号码、验证码之一不正确)
如已存在,检查过期时间(用户提交时间-条目创建时间是否小于等于 120 秒)
与此同时,跑一个定时脚本,每隔 10 分钟啊 20 分钟去删数据:
已验证的。
距离脚本操作时间大于 120 秒或更长时间的;
希望有用。
TA贡献1851条经验 获得超4个赞
Redis清除过期缓存就两种办法:
根据key获取value时判断是否过期
通过一个过期队列(根据过期时间排序)来清除过期数据
所以对于验证码这种也可以考虑这么做:
方案一: 在输入验证码之后,判断验证码是否正确的时候,如果验证码正确,判断一下验证码是否过期。
方案二: 将手机号码,验证码存储到一个Map中,同时将手机号码,过期时间存储到DelayQueue中。另起一个线程,不断地从DelayQueue中获取元素,将获取到的元素从Map删除。
这两个方案可以同时都用,或者只用其一。
DelayQueue: 延时队列,Blocking队列,内部实现是用一个Priority队列,以延迟时间作为比较的依据。只有达到延迟时间之后元素才可以被获得,可用于清除空闲连接,过期缓存,超时任务等(例如缓存,将缓存对象放到DelayQueue中,delay时间等于缓存过期时间,运行一个deamon线程从DelayQueue中获取元素,然后将其清除)。
添加回答
举报