使用Redis加锁对请求进行去重

场景:对请求过来相同的数据进行去重

如一个Http的Get请求中
/get?a=zhangsan
/get?a=lisi
/get?a=zhangsan
/get?a=wangwu
/get?a=lisi

a 的值相同的请求,每天处理一次,我们会怎么解决呢?

  1. 常规思路:

判断这个请求是否存在,如果不存在则处理,存在则不处理

技术方案:
使用Redis 进行处理,KEY 如: STR:zhangsan

判断STR:zhangsan 是否存在,不存在则处理,处理完成则将该key改为1(注意处理请求需要花费时间,所以中间有Gap时间),并且失效时间设置为当天23点59分59秒

  1. 出现问题:

同一时刻,两个zhangsan 同时请求过来,然后Redis判断 STR:zhangsan 是否存在,这个时候都不存在,两个请求都进行了处理

问题出现原因:

使用Redis 中Exists 判断以后再进行逻辑操作,这个逻辑操作比较耗时,或者说两个请求同时到达。简单总结就是,应该进行加锁处理,然后再进行自己的逻辑处理。问题出现的原因是Exists 判断以后,中间有一个Gap的时间,也可以理解为 Exists 和 Set 是两个操作,不是一个原子性的操作,在这两个操作中间如果有请求进来都会造成不一致的情况。

  1. 修复问题

修改为对key进行Incr操作,当返回结果为1的时候进行处理,如果不为1不进行处理。这就可以简单实现我们对请求的简单去重操作了。

  1. 总结:

4.1 对Redis操作自以为很了解,真正应用到项目中并不熟练

4.2 设计方案不合理,没有考虑到并发请求

4.3 知道和做到差好多,多做一些东西,多写些代码,少谈些主义

原文地址:https://www.cnblogs.com/zhangpengfei5945/p/12982382.html