不言不语

您现在的位置是: 首页 >  数据库  >  Redis

Redis

redis实例--分布式锁

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


文章评论