多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
当程序的访问量大到一定程度之后我们通常会采用分布式架构,使用多台应用程序服务器来运行代码,之前文章我们已经介绍过在分布式架构下如何使用独立存储 SESSION。在高并发的情况下还有一种情况很常见,尤其是在多进程,多线程的情况下使用独立 Redis 服务器时,当某个时间缓存不存在,请求量又很大的时候,大量请求涌向数据库,导致数据库崩溃。这时我们可以使用分布式锁来解决问题。 ## 使用分布式锁的数据缓存 ~~~ public function getUserData($user_id) { $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); // 缓存存在直接返回缓存 if ($data = $redis->get("user:{$user_id}")) { return $data; } // 如果抢占失败再读取一次缓存 if (!$redis->setnx('lock', 1)) { sleep(1); $data = $redis->get("user:{$user_id}"); } else { $data = Db::name('user')->where('id', $user_id)->find(); // 缓存数据 $redis->set('user:{$user_id}', $data); // 释放锁 $redis->delete('lock'); } return $data; } ~~~