當程序的訪問量大到一定程度之后我們通常會采用分布式架構,使用多臺應用程序服務器來運行代碼,之前文章我們已經介紹過在分布式架構下如何使用獨立存儲 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;
}
~~~