7 häufige Verwendungsszenarien von Redis in der PHP-Praxis

coldplay.xixi
Freigeben: 2023-04-08 22:18:01
nach vorne
2857 Leute haben es durchsucht

7 häufige Verwendungsszenarien von Redis in der PHP-Praxis

Redis ist eine Open-Source-Schlüsselwertdatenbank im Protokolltyp, die in der ANSI-C-Sprache geschrieben ist, Netzwerke unterstützt, speicherbasiert und persistent sein kann und APIs in mehreren Sprachen bereitstellt.

In diesem Artikel werden hauptsächlich die wichtigsten Anwendungsszenarien der Verwendung von Redis mit PHP vorgestellt.

Einfache Übung zum String-Cache

$redis->connect('127.0.0.1', 6379);$strCacheKey  = 'Test_bihu';

//SET 应用$arrCacheData = [	'name' => 'job',	'sex'  => '男',	'age'  => '30'];$redis->set($strCacheKey, json_encode($arrCacheData));$redis->expire($strCacheKey, 30);  # 设置30秒后过期$json_data = $redis->get($strCacheKey);$data = json_decode($json_data);
print_r($data->age); //输出数据

//HSET 应用$arrWebSite = [	'google' => [		'google.com',		'google.com.hk'
	],
];$redis->hSet($strCacheKey, 'google', json_encode($arrWebSite['google']));$json_data = $redis->hGet($strCacheKey, 'google');$data = json_decode($json_data);
print_r($data); //输出数据复制代码
Nach dem Login kopieren

Einfache Übung zur Warteschlange

$redis->connect('127.0.0.1', 6379);$strQueueName  = 'Test_bihu_queue';

//进队列$redis->rpush($strQueueName, json_encode(['uid' => 1,'name' => 'Job']));$redis->rpush($strQueueName, json_encode(['uid' => 2,'name' => 'Tom']));$redis->rpush($strQueueName, json_encode(['uid' => 3,'name' => 'John']));echo "---- 进队列成功 ---- <br /><br />";

//查看队列$strCount = $redis->lrange($strQueueName, 0, -1);echo "当前队列数据为: <br />";
print_r($strCount);

//出队列$redis->lpop($strQueueName);echo "<br /><br /> ---- 出队列成功 ---- <br /><br />";

//查看队列$strCount = $redis->lrange($strQueueName, 0, -1);echo "当前队列数据为: <br />";
print_r($strCount);复制代码
Nach dem Login kopieren

Einfache Übung zum Veröffentlichen und Abonnieren

//以下是 pub.php 文件的内容 cli下运行
ini_set('default_socket_timeout', -1);$redis->connect('127.0.0.1', 6379);$strChannel = 'Test_bihu_channel';

//发布$redis->publish($strChannel, "来自{$strChannel}频道的推送");echo "---- {$strChannel} ---- 频道消息推送成功~ <br/>";$redis->close();复制代码
Nach dem Login kopieren
rrree

Einfache Gegenübung

//以下是 sub.php 文件内容 cli下运行
ini_set('default_socket_timeout', -1);$redis->connect('127.0.0.1', 6379);$strChannel = 'Test_bihu_channel';

//订阅echo "---- 订阅{$strChannel}这个频道,等待消息推送...----  <br/><br/>";$redis->subscribe([$strChannel], 'callBackFun');function callBackFun($redis, $channel, $msg)
{
	print_r([		'redis'   => $redis,		'channel' => $channel,		'msg'     => $msg
	]);
}复制代码
Nach dem Login kopieren

Praktische Rangliste

$redis->connect('127.0.0.1', 6379);$strKey = 'Test_bihu_comments';

//设置初始值$redis->set($strKey, 0);$redis->INCR($strKey);  //+1$redis->INCR($strKey);  //+1$redis->INCR($strKey);  //+1$strNowCount = $redis->get($strKey);echo "---- 当前数量为{$strNowCount}。 ---- ";复制代码
Nach dem Login kopieren

Einfache stringpessimistische Sperrübung

Erklärung: Pessimistic Lock ist, wie der Name schon sagt, sehr pessimistisch.

Jedes Mal, wenn ich die Daten abrufe, denke ich, dass andere sie ändern werden, also sperre ich sie jedes Mal, wenn ich die Daten erhalte.

Szenario: Wenn im Projekt Cache verwendet wird und ein Timeout für den Cache festgelegt ist.

Wenn die Parallelität relativ groß ist und kein Sperrmechanismus vorhanden ist, dringt in dem Moment, in dem der Cache abläuft,

Eine große Anzahl gleichzeitiger Anforderungen in den Cache ein und fragt die Datenbank direkt ab , was zu einem Lawineneffekt führt.

$redis->connect('127.0.0.1', 6379);$strKey = 'Test_bihu_score';

//存储数据$redis->zadd($strKey, '50', json_encode(['name' => 'Tom']));$redis->zadd($strKey, '70', json_encode(['name' => 'John']));$redis->zadd($strKey, '90', json_encode(['name' => 'Jerry']));$redis->zadd($strKey, '30', json_encode(['name' => 'Job']));$redis->zadd($strKey, '100', json_encode(['name' => 'LiMing']));$dataOne = $redis->ZREVRANGE($strKey, 0, -1, true);echo "---- {$strKey}由大到小的排序 ---- <br /><br />";
print_r($dataOne);$dataTwo = $redis->ZRANGE($strKey, 0, -1, true);echo "<br /><br />---- {$strKey}由小到大的排序 ---- <br /><br />";
print_r($dataTwo);复制代码
Nach dem Login kopieren

Optimistic Lock-Praxis für einfache Transaktionen

Erklärung: Optimistic Lock ist, wie der Name schon sagt, sehr optimistisch.

Jedes Mal, wenn ich die Daten abrufe, denke ich, dass andere sie nicht ändern werden, also werde ich sie nicht sperren.

Der Befehl „watch“ überwacht den angegebenen Schlüssel, seit er „watch“ während der Ausführung aufgerufen hat, und die gesamte Transaktion schlägt fehl.

Sie können watch auch mehrmals aufrufen, um mehrere Tasten zu überwachen. Auf diese Weise kann dem angegebenen Schlüssel eine optimistische Sperre hinzugefügt werden.

Beachten Sie, dass der Überwachungsschlüssel für die gesamte Verbindung gültig ist und das Gleiche auch für Transaktionen gilt.

Wenn die Verbindung unterbrochen wird, werden sowohl Überwachungen als auch Transaktionen automatisch gelöscht.

Natürlich löschen die Befehle „exec“, „discard“ und „unwatch“ die gesamte Überwachung in der Verbindung.

/**
 * 获取锁
 * @param  String  $key    锁标识
 * @param  Int     $expire 锁过期时间
 * @return Boolean
 */
public function lock($key = '', $expire = 5) {	$is_lock = $this->_redis->setnx($key, time()+$expire);
	//不能获取锁	if(!$is_lock){
		//判断锁是否过期		$lock_time = $this->_redis->get($key);
		//锁已过期,删除锁,重新获取		if (time() > $lock_time) {
			unlock($key);			$is_lock = $this->_redis->setnx($key, time() + $expire);
		}
	}	return $is_lock? true : false;
}

/**
 * 释放锁
 * @param  String  $key 锁标识
 * @return Boolean
 */
public function unlock($key = ''){	return $this->_redis->del($key);
}

// 定义锁标识$key = 'Test_bihu_lock';

// 获取锁$is_lock = lock($key, 10);if ($is_lock) {	echo 'get lock success<br>';	echo 'do sth..<br>';
	sleep(5);	echo 'success<br>';
	unlock($key);
} else { //获取锁失败	echo 'request too frequently<br>';
}复制代码
Nach dem Login kopieren

Danke ~


Empfohlenes Tutorial: „PHP-Tutorial

Das obige ist der detaillierte Inhalt von7 häufige Verwendungsszenarien von Redis in der PHP-Praxis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.im
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage