当程序的访问量大到一定程度之后我们通常会采用分布式架构,使用多台应用程序服务器来运行代码,之前文章我们已经介绍过在分布式架构下如何使用独立存储 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;
}
~~~