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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | $redis ->connect('127.0.0.1', 6379);
$strCacheKey = 'Test_bihu';
$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);
$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 );
|
Copier après la connexion
Pratique simple de file d'attente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $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 );
|
Copier après la connexion
Pratique simple de publication et d'abonnement
1 2 3 4 5 6 7 8 9 | 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();
|
Copier après la connexion
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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
]);
}
|
Copier après la connexion
Pratique de contre simple
1 2 3 4 5 6 7 8 9 10 11 12 13 | $redis ->connect('127.0.0.1', 6379);
$strKey = 'Test_bihu_comments';
$redis ->set( $strKey , 0);
$redis ->INCR( $strKey );
$redis ->INCR( $strKey );
$redis ->INCR( $strKey );
$strNowCount = $redis ->get( $strKey );
echo "---- 当前数量为{$strNowCount}。 ---- " ;
|
Copier après la connexion
Pratique du classement
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $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 );
|
Copier après la connexion
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
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;
}
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>';
}
|
Copier après la connexion
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $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/>" ;
$redis ->set( $strKey ,20);
$redis -> exec ();
$age = $redis ->get( $strKey );
echo "---- Current Age:{$age} ---- <br/><br/>" ;
|
Copier après la connexion