redis 锁 set nx 的顺序影响功能实现是什么原因
在实现防止重复提交功能时,采用 redis 锁来实现,写好了一版之后本地测试正常,但是放到线上发现还是有重复的内容
通过在网上搜索之后发现代码的不同之处进行修改,已成功修复问题,但是原理没看懂,测试代码如下,忽略未实现释放的逻辑
// 有问题的代码
$rs = Redis::set($key, $value, 'nx', 'ex', 3);
if (!$rs) {
return response()->json([], 204);
}
// 有效的代码
$rs = Redis::set($key, $value, 'ex', 3, 'nx');
if (!$rs) {
return response()->json([], 204);
}
可以看到唯一不同的地方就是nx的位置,问题是我本地测试第一种也是可行的
另线上环境采用负载均衡,部署了多个实例
本地通过使用 redis-cli monitor 监控运行的命令,发现最终运行的语句也只有顺序的不同,然后复制语句在线上的 redis-cli 中运行,也是正确的结果
线上 redis 版本为阿里云的 5.0.5
不知道大家有没有同样的问题,出现问题的原因有没有人能分析一下
推荐文章: