基于Redis的重复提交控制策略(redis重复提交控制)

2023-05-16 19:58:16 提交 重复 控制

随着移动互联网以及云技术的发展,大量高并发交互业务已经得到应用,在大量并发请求场景中,重复提交控制是一项必要的业务,可以保证每次请求的唯一性,以此来处理应用的安全性以及可用性问题。

传统的重复提交是通过session和 cookie 来控制,但是这种机制html页面可以避免,对于多个客户端请求的场景还是无法有效控制,只能用分布式或者消息队列等方法来实现。

基于 Redis 的重复提交控制策略,代码实现时,首先使用redis中的` setnx (set if not exist)`设置一个key/value来判断当前这个请求是否重复提交,具体代码如下:

public boolean checkRepeatSubmit(String sid) throws Exception {
String key = sid + "_token";
boolean flag = false;
Jedis jedis = null;
try {
jedis = RedisUtils.getResource();
if (jedis.setnx(key, sid) == 1) {
redis.expire(key, 5);//设置5秒后失效
flag = true;
} else {
flag = false;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
RedisUtils.returnResource(jedis);
}
return flag;
}

如果为1,表示这个请求第一次提交,之后提交请求时,setnx函数就会返回0,表示请求重复,这个key值已经存在,拒绝服务。

此外,对于如果请求代码没有成功执行,可以在异常catch块中释放资源,以及在finally块中主动删除 key / value,避免造成资源泄露的问题,非常有效的保证了重复提交的安全性,具体代码如下:

public boolean checkRepeatSubmit(String sid) throws Exception {
String key = sid + "_token";
boolean flag = false;
Jedis jedis = null;
try {
jedis = RedisUtils.getResource();
if (jedis.setnx(key, sid) == 1) {
redis.expire(key, 5);//设置5秒后失效
flag = true;
} else {
flag = false;
}
}catch (Exception e) {
jedis.del(key);
}finally {
RedisUtils.returnResource(jedis);
}
return flag;
}

基于Redis的重复提交控制可以增加系统的可用性,保证请求的唯一性。而且Redis在不同服务器机器之间实现数据同步,也更有效的满足分布式场景的需求。

相关文章