7 häufige Verwendungsszenarien von Redis (PHP praktisch)

阿神
Freigeben: 2023-03-06 08:18:02
Original
3292 Leute haben es durchsucht

Redis ist eine Open-Source-Schlüsselwertdatenbank vom 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 String-Cache-Praxis

$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 Warteschlangenübung

$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 Veröffentlichungs- und Abonnementpraxis

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

//发布
$redis->publish($strChannel, "来自{$strChannel}频道的推送");
echo "---- {$strChannel} ---- 频道消息推送成功~ <br/>";
$redis->close();
Nach dem Login kopieren
//以下是 sub.php 文件内容 cli下运行
ini_set(&#39;default_socket_timeout&#39;, -1);
$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strChannel = &#39;Test_bihu_channel&#39;;

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


Einfache Gegenübungen

$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strKey = &#39;Test_bihu_comments&#39;;

//设置初始值
$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

Leaderboard-Übungen

$redis->connect(&#39;127.0.0.1&#39;, 6379);
$strKey = &#39;Test_bihu_score&#39;;

//存储数据
$redis->zadd($strKey, &#39;50&#39;, json_encode([&#39;name&#39; => &#39;Tom&#39;]));
$redis->zadd($strKey, &#39;70&#39;, json_encode([&#39;name&#39; => &#39;John&#39;]));
$redis->zadd($strKey, &#39;90&#39;, json_encode([&#39;name&#39; => &#39;Jerry&#39;]));
$redis->zadd($strKey, &#39;30&#39;, json_encode([&#39;name&#39; => &#39;Job&#39;]));
$redis->zadd($strKey, &#39;100&#39;, json_encode([&#39;name&#39; => &#39;LiMing&#39;]));

$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


Einfache stringpessimistische Sperrpraxis

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.

/**
 * 获取锁
 * @param  String  $key    锁标识
 * @param  Int     $expire 锁过期时间
 * @return Boolean
 */
public function lock($key = &#39;&#39;, $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 = &#39;&#39;){
    return $this->_redis->del($key);
}

// 定义锁标识
$key = &#39;Test_bihu_lock&#39;;

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


Optimistische Schließ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 Verriegelung 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.

$strKey = &#39;Test_bihu_age&#39;;

$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后发生过变化,则整个事务会失败
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
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