一个手机号在5分钟内发了3次短信,使用redis实现拦截,1个小时后放行
时间: 2023-04-05 10:03:14 浏览: 85
可以使用 Redis 的计数器功能实现拦截。首先,将手机号作为 key,每次短信发送时将计数器加 1,同时设置过期时间为 5 分钟。当计数器达到 3 时,就拦截该手机号的短信发送,并将该手机号加入黑名单,设置过期时间为 1 小时。在 1 小时后,该手机号将自动从黑名单中移除,可以重新发送短信。
相关问题
用redis实现一个小时内用户验证码只能发十次
可以实现。首先,我们需要在 Redis 中维护一个 key-value 键值对,每个用户对应一个记录其发送验证码次数的计数器。每次用户发送验证码时,我们会从 Redis 中获取该用户的计数器,判断其是否达到了十次限制。如果没有达到限制,则允许用户发送验证码,并递增计数器。如果超过限制,则拒绝用户发送验证码。
使用 Redis 进行实现,你需要用到以下命令:
1. `INCR key`:让键 key 的值加一,如果 key 不存在,则创建并把值初始化为 0,返回增加后的结果。
2. `EXISTS key`:返回键 key 是否存在于 Redis 中。
3. `TTL key`:获取 key 的剩余生存时间。
4. `SET key value [EX seconds] [PX milliseconds] [NX|XX]`:将键 key 的值设为 value,如果 key 已经存在,则用新的 value 进行覆盖。同时可以指定键的过期时间。
你可以通过以下代码实现:
```python
import redis
class RedisUtils:
def __init__(self, host, port, db):
self.redis_conn = redis.Redis(host=host, port=port, db=db)
def send_code_available(self, user_id):
key = f"send_code_times_{user_id}"
count = self.redis_conn.get(key)
if count and int(count) >= 10:
return False
self.redis_conn.incr(key)
self.redis_conn.expire(key, 3600)
return True
redis_conn = RedisUtils("localhost", 6379, 0) # Redis 连接
user_id = "123456" # 用户 ID
if redis_conn.send_code_available(user_id):
# 发送验证码
pass
else:
print("一小时内不能发送超过十次验证码")
```
有一个获取手机验证码的业务,当我们五分钟类获取短信验证码的次数超过了2次,就把对应的手机号放入黑名单,java代码如何操作redis实现
可以使用Redis的计数器功能来实现这个业务逻辑。具体实现步骤如下:
1. 使用Redis的INCR命令对每个手机号码的计数器进行自增操作,表示该手机号码已经获取了一次验证码。
2. 使用Redis的EXPIRE命令设置每个手机号码的计数器的过期时间为5分钟,表示该手机号码在5分钟内只能获取2次验证码。
3. 在每次获取验证码时,先使用Redis的GET命令获取该手机号码的计数器的值,如果该值大于等于2,则表示该手机号码已经获取了2次验证码,需要将该手机号码加入黑名单。
4. 在将手机号码加入黑名单时,可以使用Redis的SET命令将该手机号码作为key,将当前时间作为value,表示该手机号码被加入黑名单的时间。
5. 在每次获取验证码时,需要先使用Redis的GET命令获取该手机号码是否在黑名单中,如果存在,则表示该手机号码已经被加入黑名单,不能再获取验证码。
6. 在将手机号码从黑名单中移除时,可以使用Redis的DEL命令将该手机号码从黑名单中删除。
Java代码实现可以参考以下示例:
```
import redis.clients.jedis.Jedis;
public class SmsVerificationCode {
private static final String REDIS_HOST = "localhost";
private static final int REDIS_PORT = 6379;
private static final int MAX_SMS_COUNT = 2;
private static final int SMS_EXPIRE_TIME = 300; // 5 minutes in seconds
private Jedis jedis;
public SmsVerificationCode() {
jedis = new Jedis(REDIS_HOST, REDIS_PORT);
}
public boolean canGetSms(String phoneNumber) {
String key = "sms_count:" + phoneNumber;
String blackListKey = "black_list:" + phoneNumber;
// Check if the phone number is in the black list
if (jedis.exists(blackListKey)) {
return false;
}
// Increment the SMS count for the phone number
long count = jedis.incr(key);
// Set the expire time for the SMS count
jedis.expire(key, SMS_EXPIRE_TIME);
// Check if the SMS count exceeds the maximum allowed count
if (count > MAX_SMS_COUNT) {
// Add the phone number to the black list
jedis.set(blackListKey, String.valueOf(System.currentTimeMillis()));
return false;
}
return true;
}
public void removeFromBlackList(String phoneNumber) {
String blackListKey = "black_list:" + phoneNumber;
jedis.del(blackListKey);
}
}
```
使用示例:
```
SmsVerificationCode smsVerificationCode = new SmsVerificationCode();
// Check if the phone number can get SMS
if (smsVerificationCode.canGetSms("123456789")) {
// Send SMS verification code
} else {
// Phone number is in the black list, cannot get SMS
}
// Remove phone number from black list
smsVerificationCode.removeFromBlackList("123456789");
```
注意:以上示例仅供参考,实际应用中需要根据具体业务逻辑进行调整。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)