Yii2-Redis の使用に関するメモ
数日前に Redis について簡単に学習しましたが、今ではプロジェクトで使用する準備ができています。現在 Yii2 フレームワークを使用しています。公式 Web サイトで Redis を検索したところ、yii2-redis 拡張機能が見つかりました。
インストール後の使用は非常に簡単です。common/config/main.php ファイルを次のように変更します。
'cache' => [ // 'class' => 'yii\caching\FileCache', 'class' => 'yii\redis\Cache',],'redis' => [ 'class' => 'yii\redis\Connection', 'hostname' => 'localhost', 'port' => 6379, 'database' => 0,],
OK、Yii のキャッシュを引き継ぐために redis が使用されました。キャッシュの使用方法は以前と同じです。 、ただし、バグのバグには当てはまらないことが 1 つあるので、それについては後で説明します。
まずキャッシュをテストしてみましょう。
Yii::$app->cache->set('test', 'hehe..');echo Yii::$app->cache->get('test'), "\n";Yii::$app->cache->set('test1', 'haha..', 5);echo '1 ', Yii::$app->cache->get('test1'), "\n";sleep(6);echo '2 ', Yii::$app->cache->get('test1'), "\n";
テスト結果を見てみましょう。
以前と同じ使い方で問題ありません。 。
でも、さっきも言いましたが、バグではないバグがあるので、それは何ですか?
redis を直接使用してキャッシュを引き継ぐ場合、通常通り使用する場合は問題ありませんが、有効期限の値が int の範囲を超えると、redis はエラーを報告します。
私は yii2-admin を使用しましたが、これはたまたま私にとって罠でした。これは 30 日間 (2592000 秒) キャッシュされ、Redis キャッシュ時間の精度はデフォルトでミリ秒を使用するため、時間は 2592000000 ミリ秒になります。
redis の有効期限は int 型のみであるため、Cache.php の PHP では何も処理せずに強制的に int に変換されるため、-1702967296 となりエラーが報告されます。
ただし、図に示すように、redis コマンド ラインの直下には負の数は存在しません。
しかし、それは問題ではありません。修正するのは非常に簡単です。秒に変更するだけです。
vendor/yiisoft/yii2-redis/Cache.php 行 133 を開き、次のコードに変更します。
protected function setValue($key, $value, $expire){ if ($expire == 0) { return (bool) $this->redis->executeCommand('SET', [$key, $value]); } else { // $expire = (int) ($expire * 1000); // 单位默认为毫秒 // return (bool) $this->redis->executeCommand('SET', [$key, $value, 'PX', $expire]); $expire = +$expire > 0 ? $expire : 0; // 防止负数 return (bool) $this->redis->executeCommand('SET', [$key, $value, 'EX', $expire]); // 按秒缓存 }}
大丈夫です。
さて、今日はこれらを共有しましょう。明日と明後日は、接続、ActiveRecord、yii2-redis の落とし穴についてお話します。