Maison > Article > développement back-end > 7 scénarios d'utilisation courants de Redis (PHP pratique)
Redis est une base de données de valeurs-clés de type journal open source écrite en langage ANSI C, prend en charge le réseau, peut être basée sur la mémoire et persistante, et fournit des API dans plusieurs langues.
Cet article présente principalement les principaux scénarios d'application d'utilisation de Redis avec PHP.
Pratique simple du cache de chaînes
$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); //输出数据
Pratique simple de file d'attente
$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);
Pratique simple de publication et d'abonnement
//以下是 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();
//以下是 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 ]); }
Pratique de contre simple
$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}。 ---- ";
Pratique du classement
$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);
Pratique du verrouillage pessimiste à chaîne simple
Explication : Le verrouillage pessimiste, comme son nom l'indique, est très pessimiste.
Chaque fois que je vais chercher les données, je pense que d'autres vont les modifier, donc je les verrouille à chaque fois que je récupère les données.
Scénario : Si le cache est utilisé dans le projet et qu'un délai d'attente est défini pour le cache.
Lorsque la quantité de concurrence est relativement importante, s'il n'y a pas de mécanisme de verrouillage, alors au moment où le cache expire,
Un grand nombre de requêtes simultanées pénétreront dans le cache et interrogeront directement la base de données , provoquant un effet d'avalanche.
/** * 获取锁 * @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>'; }
Pratique de verrouillage optimiste pour les transactions simples
Explication : Optimistic Lock, comme son nom l'indique, est très optimiste.
Chaque fois que je vais chercher les données, je pense que les autres ne les modifieront pas, donc je ne les verrouillerai pas.
La commande watch surveillera la clé donnée. Si la clé surveillée a changé depuis l'appel de watch pendant l'exécution, la transaction entière échouera.
Vous pouvez également appeler watch plusieurs fois pour surveiller plusieurs touches. De cette manière, un verrouillage optimiste peut être ajouté à la clé spécifiée.
Notez que la clé de montre est valable pour toute la connexion, et il en va de même pour les transactions.
Si la connexion est perdue, les montres et les transactions seront automatiquement effacées.
Bien sûr, les commandes exec, throw et unwatch effaceront toute surveillance de la connexion.
$strKey = 'Test_bihu_age'; $redis->set($strKey,10); $age = $redis->get($strKey); echo "---- Current Age:{$age} ---- <br/><br/>"; $redis->watch($strKey); // 开启事务 $redis->multi(); //在这个时候新开了一个新会话执行 $redis->set($strKey,30); //新会话 echo "---- Current Age:{$age} ---- <br/><br/>"; //30 $redis->set($strKey,20); $redis->exec(); $age = $redis->get($strKey); echo "---- Current Age:{$age} ---- <br/><br/>"; //30 //当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败