一次使用Redis做短信次数验证的小思考

您所在的位置:网站首页 用户登录验证,验证次数最多三次 一次使用Redis做短信次数验证的小思考

一次使用Redis做短信次数验证的小思考

2024-07-09 13:32| 来源: 网络整理| 查看: 265

前文

都好久没写博文了,一转眼都一个月过去了,今天写点儿简单的,是我工作中遇到的,前一段时间做一个任务,里面涉及到一个发送短信次数的验证:

需求

原需求是这样的:

要求用户没小时发送短信的次数不能超过5次,如果超过了就当天限制发送!

想法

拿到这样的需求,各位小伙伴会有怎么样的想法呢,你心中的方案是什么?

话不多说!

我一开始的第一个想到的方案 是 存数据库 建一张表 记录发送的记录 然后每次发送的时候 查表再做下验证!为嘛为会这么想呢,因为我看系统里面之前发送短信频次的验证就是这么写的!

如果这样时候 我就这么写 也就没今天的博文了,后来我看了下 如果是为了验证发送短信频次 就存数据库,感觉有点不妥哈~前提说下,我们的系统是多负载的,也就是说 通过HashMap,或者list 是没法解决的~于是我就想到了Redis!

一次失败的使用

下面先看下 我第一次的方案:

private boolean LimitSendSmsFirst(String user, long maxSendCountForHour) { String redisKey = String.format("LimitSend-%s", user); long keyCount = redisTemplate.opsForValue().increment(redisKey, 1); if (keyCount == 1) { redisTemplate.expire(redisKey, (60 * 60), TimeUnit.SECONDS); } if (keyCount > maxSendCountForHour) { System.out.printf("当前用户 %s 发送短信已经超每小时 %d 次上限", user, maxSendCountForHour); return false; } return true; }

参数说明:

user 就是发送的用户,可以使用用户ID,手机号码等 代表发送用户标识的参数maxSendCountForHour 就是每小时最大可以发送的次数

咋一看 我这代码写的很棒

首先我使用了一个原子命令 每次调用的时候次数加1,这儿说明下increment 如果key不存在的话 默认的值是0,那调用过一次后 得到的值就是1了,因为我每次都是加1的!

这样我在第一次使用的时候,设置当前的key 是1个小时,因为我要判断1个小时内 发送的次数嘛,这样做没毛病!~

下面就是 我判断当前的发送次数 如果是发送次数已经大于设置的超限数组,我就返回发送失败! 否则就成功!

于是 我很完美的 完成了~

不知道 看到这里 有没有小伙伴 发现这个代码验证逻辑是有问题的~

bibibibibibi

嗯嗯 让我想一下!!!

bibibibibibi

好吧!!!

想不出来 那我们就来测试下:

@Test public void testLimitSendSMS() throws InterruptedException { for (int i = 0; i maxSendCountForHour) { System.out.printf("当前用户 %s 发送短信已经超每小时 %d 次上限", user, maxSendCountForHour); return false; } return true; }

我这边修改了下代码 没秒钟发送一次,限制10秒钟之内只能发送5次!

看下代码的执行结果:

当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。用户 burgxun 发送短信成功 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限 当前用户 burgxun 开始发送短信。。。当前用户 burgxun 发送短信已经超每小时 5 次上限

看执行的很完美~ 10秒种只能发送5次成功的~

但是当我修改下代码的,如果是这样执行的话:

@Test public void testLimitSendSMS() throws InterruptedException { Integer[] arr = new Integer[]{1, 8, 9, 10, 11, 12, 13}; List integerList = Arrays.asList(arr); for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3