ホームページ バックエンド開発 PHPチュートリアル Redisの一般的な利用シナリオの共有

Redisの一般的な利用シナリオの共有

May 31, 2018 am 09:31 AM
redis 共有 シーン

この記事では、主に Redis の一般的な使用シナリオと簡単な文字列キャッシュの実践について説明します。

$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); //输出数据
ログイン後にコピー

簡単なキューの練習

$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);
ログイン後にコピー

簡単なパブリッシュとサブスクライブの練習

//以下是 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
    ]);
}
ログイン後にコピー

ランキングの練習

$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}。 ---- ";
ログイン後にコピー
$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);
ログイン後にコピー

説明: 悲観的ロックは、名前が示すように、非常に悲観的です。

データを取りに行くたびに他の人が改変してしまうと思うので、データを取得するたびにロックをかけています。

シナリオ: プロジェクトでキャッシュが使用されており、キャッシュにタイムアウトが設定されている場合。

同時実行の量が比較的大きい場合、ロックメカニズムがないと、キャッシュの有効期限が切れた瞬間に、

多数の同時リクエストがキャッシュに侵入し、データベースに直接クエリを実行し、雪崩現象を引き起こします。

/**
 * 获取锁
 * @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>';
}
ログイン後にコピー

単純なトランザクションのための楽観的ロックの実践

説明: 楽観的ロックは、名前が示すように、非常に楽観的です。

データを取りに行くたびに、他人が改変しないだろうと思うのでロックはしません。

watch コマンドは指定されたキーを監視します。実行中に watch を呼び出してから監視対象のキーが変更された場合、トランザクション全体が失敗します。

watch を複数回呼び出して、複数のキーを監視することもできます。このようにして、指定したキーに楽観的ロックを追加できます。

監視キーは接続全体に対して有効であり、トランザクションにも同じことが当てはまることに注意してください。

接続が失われた場合、ウォッチとトランザクションの両方が自動的にクリアされます。

もちろん、exec、discard、および unwatch コマンドは、接続内のすべての監視をクリアします。

$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后发生过变化,则整个事务会失败
ログイン後にコピー

関連する推奨事項:

PHP リンク redis メソッド コード
php+redis 共有の簡単な例

PHP での Redis のいくつかの使用方法

以上がRedisの一般的な利用シナリオの共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11 10.0.22000.100 のインストール時の 0x80242008 エラーの解決策 Windows 11 10.0.22000.100 のインストール時の 0x80242008 エラーの解決策 May 08, 2024 pm 03:50 PM

Windows 11 10.0.22000.100 のインストール時の 0x80242008 エラーの解決策

自動運転シナリオにおけるロングテール問題を解決するにはどうすればよいでしょうか? 自動運転シナリオにおけるロングテール問題を解決するにはどうすればよいでしょうか? Jun 02, 2024 pm 02:44 PM

自動運転シナリオにおけるロングテール問題を解決するにはどうすればよいでしょうか?

PHP機能のボトルネックを分析し、実行効率を向上 PHP機能のボトルネックを分析し、実行効率を向上 Apr 23, 2024 pm 03:42 PM

PHP機能のボトルネックを分析し、実行効率を向上

Redisはメモリキャッシュですか? Redisはメモリキャッシュですか? Apr 20, 2024 am 05:26 AM

Redisはメモリキャッシュですか?

Golang API のキャッシュ戦略と最適化 Golang API のキャッシュ戦略と最適化 May 07, 2024 pm 02:12 PM

Golang API のキャッシュ戦略と最適化

redis は非リレーショナル データベースですか? redis は非リレーショナル データベースですか? Apr 20, 2024 am 05:36 AM

redis は非リレーショナル データベースですか?

erlang と golang ではどちらのパフォーマンスが優れていますか? erlang と golang ではどちらのパフォーマンスが優れていますか? Apr 21, 2024 am 03:24 AM

erlang と golang ではどちらのパフォーマンスが優れていますか?

PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践 PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践 May 09, 2024 pm 01:30 PM

PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践

See all articles