🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 业务场景 1. 分布式项目部署的环境下,使用分布式锁来保证缓存的单线程写,这样可以避免同一时间大量缓存失效导致请求全部落在DB上。 2. 多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了。 3. 订单防超卖。 > 数据是需要保证唯一性,就需要分布式锁。 ## 实现 ~~~php // 加锁。 10s 过期 if (!$ret = $redis->set('key', 'value', ['nx', 'ex' => 10])) { // 获取锁失败 } try{ // 处理业务…… } catch (\Exception $e) { } finally { // 解锁 $script = 'if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end'; $redis->eval($script, 'key', 'value'); } ~~~