基于Redis的重复提交控制策略(redis重复提交控制)
随着移动互联网以及云技术的发展,大量高并发交互业务已经得到应用,在大量并发请求场景中,重复提交控制是一项必要的业务,可以保证每次请求的唯一性,以此来处理应用的安全性以及可用性问题。
传统的重复提交是通过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在不同服务器机器之间实现数据同步,也更有效的满足分布式场景的需求。