我们的代码逻辑是,当接收到用户的请求时,会先去数据库查看该数据是否存在,如果不存在,就加入数据库,如果存在就返回错误。结果发现数据库里面有大量的相同值。
经过分析可能存在一个并发的问题,当两个请求同时到达的时候,两个请求同时处理,去数据库查询的是否都不存在,然后同时插入,就会存在误差。
还有一个原因是我们的数据库是读写分离,数据在主从数据库间的同步存在1S的误差,所以当一个数据插入成功后,如果立即查询就会查询不到。
思考之后决定加一个任务锁,用redis实现,因为redis是单进程单线程命令是顺序执行的,不存在并发引起数据不同步的问题。
用的命令是
set lock 1 ex 60 nx
set lock 1 设置一个 值为1,键为lock的数据; ex 60 过期时间为 60秒 ; nx 不存在的时候创建键,存在的时候不创建。 设置成功返回 Ok;设置失败 返回 nil