使用redis incr处理并发问题

一、背景

    最近公司某个短信接口因为没有加验证码限制被恶意调用,最好的解决办法是做在发送短信请求前做一个验证码验证通过后再调用短信接口。但是由于需要立马改动,借此使用了一下 “缓兵之计”--redis计数器限制

二、使用redis计数器引入黑名单机制

   incr是redis中一个递增函数手册是这样介绍的

Redis Incr 命令将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

那么可以通过这个函数,将一分钟内请求短信次数超过3次的手机号拉黑(具体短信请求几次根据具体业务场景确定,我们公司这个业务一分钟内请求2次短信就可以的)

补分代码如下,使用expire设置key的生命周期。在expire(多长时间内)这个key被用一次就incr一次。具体上限自己确定

注意:自增函数 ,key为自己定义字符串+手机号(方便删除)

<textarea readonly="readonly" name="code" class="Java"> 
 public Long incr(String key) {
            Jedis jedis = Redis.Operate.getJedis();
            try {
                return jedis.incr(key);
            } finally {
                if (null != jedis) {
                	jedis.close();
                }
            }
        }
//使用expire设定key的生命周期,(即在多长时间内计数达到上限)
public void expire(String key, int seconds) {
            Jedis jedis = Redis.Operate.getJedis();
            try {
                jedis.expire(key, seconds);
            } finally {
                jedis.close();
            }
        }





//最后写判断 count 数和最后自增数比较。超了就。。。。你懂得。大体如下
long count = incr(key);
if (count == 1) {
expire(key,60);
}
if (count > 1) {
//GG,你懂得
return;
}



发布了41 篇原创文章 · 获赞 157 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/w05980598/article/details/80213992