redis 任务锁

我们的代码逻辑是,当接收到用户的请求时,会先去数据库查看该数据是否存在,如果不存在,就加入数据库,如果存在就返回错误。结果发现数据库里面有大量的相同值。

经过分析可能存在一个并发的问题,当两个请求同时到达的时候,两个请求同时处理,去数据库查询的是否都不存在,然后同时插入,就会存在误差。

还有一个原因是我们的数据库是读写分离,数据在主从数据库间的同步存在1S的误差,所以当一个数据插入成功后,如果立即查询就会查询不到。

思考之后决定加一个任务锁,用redis实现,因为redis是单进程单线程命令是顺序执行的,不存在并发引起数据不同步的问题。

用的命令是 set lock 1 ex 60 nx

set lock 1 设置一个 值为1,键为lock的数据; ex 60 过期时间为 60秒 ; nx 不存在的时候创建键,存在的时候不创建。 设置成功返回 Ok;设置失败 返回 nil

发表评论

电子邮件地址不会被公开。 必填项已用*标注