ホームページ  >  記事  >  バックエンド開発  >  Redis の使用に関するバグ ノート (実行)

Redis の使用に関するバグ ノート (実行)

WBOY
WBOYオリジナル
2016-06-13 12:23:371140ブラウズ

Redis の使用バグ記録 (exec)

プロジェクトで、ブロガーはツール クラスで Redis クラスを使用しました。Redis はパイプラインのパイプラインと exec コマンドをカプセル化していなかったため、ペン ストロークで作成しました。 __call;

コードの一部は次のとおりです ($this->_connect() は Redis インスタンスを返します)。

その後何が起こったかはもう中国語では表現できません、コードは次のとおりです

$redis->pipeline();

$redis->lpop($key);

$redis->lpop($key);

$redis->exec();

自分で簡単なサンプル テストを作成した後、通常の状況では、$key キューのスタックの上位 2 つの要素、つまり array('item1','item2'); が返されるはずですが、今回は最終的な返結果が返されます。 NULL であることが判明しました、ブロガーさん、このとき、

は非常に混乱していました。もしかしたら、適用された関数 call_user_fun_array() に戻り値がないのではないか、これは私の父を騙すことになるのではないでしょうか?これは単なる個人的な推測です。PHP の宝典にはそのような説明はありませんが、以下の例を見て自分でテストしてください。戻り値、つまり、この推測は失敗しました。

さて、時間が経ってもまだ問題が見つからないので、会社の同僚にアドバイスを求めました。 $this ->_connect() は redis オブジェクトであるため、$this->_redis へのハンドルはないのですか?何か魔法のようなことが起こり、戻り値が返されます。

わかりました。これで、$this->_connect() と $this-> について何があるかがわかります。 _redis 上記のコードと同様に、2 つの変数を直接ダンプします。

後で、これが事実であることがわかりました。下の写真を見ている当局者は、これらが 2 つの異なるリソースであることを理解する必要があります。

問題はわかった気がしたので、_connect() 関数に戻ったところ、そこに Redis シングルトンがないことがわかりました。毎回新しい Redis オブジェクトが作成されていました。 。

それで、問題をまだ知らない読者は引き続き私をフォローしてください。

この問題については、当社の技術者は何も言いません。Redis 操作コマンドのバッチでは、3 つの異なる Redis オブジェクトが使用されています。直接の実行であり、パイプラインがなかったので、NULL に違いありません。

信じられますか? とにかく、私はそれを信じていました、そしてもちろん、私は騙したのです。自分自身。事の真相が今明かされる。怪物を倒すには自滅の道があった。

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