实例:分布式锁



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

}

Delevin、博客