ホームページ > バックエンド開発 > PHPチュートリアル > [転送] redis のパフォーマンス比較; memcache_PHP チュートリアル;

[転送] redis のパフォーマンス比較; memcache_PHP チュートリアル;

WBOY
リリース: 2016-07-13 10:28:17
オリジナル
735 人が閲覧しました

まず私自身の使用法について話させてください:

最初の memcache が使用されます。これは、キーと値の関係のためのサーバー側のキャッシュで、それほど大きくないが、迅速な応答が必要な、一般的に使用されるデータを保存するために使用されます。


その後、別のところでredisが使われていたので、redisの勉強をしに行きました。 一見すると、サーバー上に Redis サーバーがインストールされているように見えますが、実際には、使い方は memcache と同じです。いくつかのパラメータで。 同じ。もちろん、キャッシュ効果も異なります。具体的にはどのような違いがあるのでしょうか。いくつかの情報と私自身のまとめを以下に示します。



1. Redis と Memcache はどちらもデータをメモリに保存し、インメモリ データベースです。ただし、me​​mcache は、写真やビデオなど、他のものをキャッシュするために使用することもできます。


以下の次元から、

redismemcachemongoDB 、投票へようこそを比較しました

1

、パフォーマンス

それらはすべて比較的高いので、パフォーマンスがボトルネックになることはありません

一般に、

TPSの観点から見ると、redismemcacheとほぼ同じですが、mongodbよりも大きくなります

2

、操作の便利さ

memcache

単一のデータ構造 データ操作の点では、

Redis の一部がより豊富で、 Redis の方が優れており、ネットワークの数は io mongodb

豊富なデータ表現、インデックス作成をサポートし、リレーショナル データベースに最も似ており、幅広いクエリ言語をサポートします 3

、メモリ空間のサイズとデータのサイズ redis

は、 2.0 バージョンの後に独自の VM 機能を追加し、物理メモリの制限を突破しました。 value有効期限を設定します (memcacheと同様) memcacheは利用可能な最大メモリを変更できます

LRUアルゴリズムを採用しています MongoDB は、メモリ管理をオペレーティング システム

VM に依存しており、他のサービス と組み合わせるべきではありません。 4、在庫状況 (単一ポイントの問題)

単一点の質問については、

Redis赖、メインとスレーブのコピー時にクライアントに依存し、ノードから接続されるたびにメインノードはスナップショット全体に依存します。

そのため、単一点の問題はより複雑です。自動

シャーディングはサポートされておらず、一貫したプログラム設定 ハッシュ メカニズムに依存する必要があります。

別の方法は、redis 独自のレプリケーション メカニズムを使用し、アクティブ レプリケーション (複数のストレージ) を自分で使用するか、増分レプリケーション (一貫性の問題とパフォーマンスのトレードオフを自分で実装する必要があります) に変更することです。 H Memcachee にはデータ冗長メカニズムがありません。また、障害防止のために、単一点障害によって引き起こされるジッターの問題を解決するために、成熟したハッシュ アルゴリズムを採用しています。

mongoDB は、マスター/スレーブ、replicaset

(内部でpaxos選択アルゴリズムを使用、自動障害回復) 、autoをサポートします シャーディングメカニズムは、フェイルオーバーおよびシャーディングメカニズムからクライアントを保護します。

5信頼性(永続性) データの永続化とデータの回復については、 redis サポート (スナップショット、

AOF

): 永続性のためにスナップショットに依存し、aof は信頼性を強化し、パフォーマンスに影響を与えます

memcache

はサポートされていません。通常、パフォーマンスを向上させるための

のキャッシュに使用されます。

MongoDB は、1.8バージョンから永続性の信頼性をサポートするためにbinlog

メソッドを採用しました。

6、データの一貫性 (トランザクションのサポート)

Memcache 同時シナリオでは、一貫性を確保するために cas を使用します

Redis トランザクションのサポートは比較的弱いため、トランザクション内の各操作が継続的に実行されることのみを保証できます

mongoDB はトランザクションをサポートしていません

7、データ分析

mongoDBにはデータ分析機能(mapreduce)が組み込まれていますが、その他はサポートされていません

8、アプリケーションシナリオ

Redis量: より高いパフォーマンスの操作とデータ量の操作

Memcache: データベース の負荷を軽減し、動的システム でパフォーマンスを向上させるために使用されます。 キャッシュとパフォーマンスの向上 (読み取りを増やし書き込みを減らすのに適しており、大量のデータには シャーディング を使用できます)中古)

MongoDB:主に大量データのアクセス効率の問題を解決します

最近Key-Valueストレージについて勉強しているので、感じたことを簡単にメモしておきます。 。一部の memcache と redis のインストールと使用については詳しく説明しません。 2 つのオプションの違いについて簡単に説明します。いくつかの 印象やテスト結果では問題を説明するのに十分ではないかもしれません。何か間違っている場合は修正してください。なぜなら、この二日間の勉強の過程で、自分の理解の欠陥を修正し、前日の考えを否定する毎日であることに気づきました。 。さて、フェイ あまり言わないでください。

500,000 のデータ ストアを調査した結果、次のことがわかりました:

1 秒あたりの単一命令の実行量

Memcache 約30,000回

redis 約10,000回

さらに、memcache の主な利点は、関数を通じて有効期限を直接設定できることですが、redis ではキーと値のペアと有効期限の両方を設定するために 2 つの関数が必要となるため、この時点での redis の効率は半分になります。元の値の 5,000 倍ですが、これはほとんどのニーズにとって少し遅すぎます。

memcacheのテストコードは以下の通りです:

$mem = 新しい Memcache;

$mem->connect("127.0.0.1", 11211);

$time_start = microtime_float();

//データを保存します

for($i = 0; $i <100000; $i ++){

$mem->set("key$i",$i,0,3);

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "$run_time 秒 n";

関数 microtime_float()

{

List($usec, $sec) =explode(" ", microtime());

Return ((float)$usec + (float)$sec);

}

?>

redisのテストコードは以下の通り: redis1.php このコードには10秒ほどかかります

//接続

$redis = 新しい Redis();

$redis->connect('127.0.0.1', 6379);

$time_start = microtime_float();

//データを保存します

for($i = 0; $i <100000; $i ++){

$redis->sadd("key$i",$i);

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "$run_time 秒 n";

//接続を閉じます

$redis->close();

関数 microtime_float()

{

List($usec, $sec) =explode(" ", microtime());

Return ((float)$usec + (float)$sec);

}

?>

キー値の設定中に有効期限を設定する必要がある場合、実行には約 20 秒かかります。テストコードは次のとおりです: redis2.php

//接続

$redis = 新しい Redis();

$redis->connect('127.0.0.1', 6379);

$time_start = microtime_float();

//データを保存します

for($i = 0; $i <100000; $i ++){

$redis->sadd("key$i",$i);

$redis->expire("key$i",3);

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "かかった時間 $run_time 秒 n";

//接続を閉じます

$redis->close();

関数 microtime_float()

{

List($usec, $sec) =explode(" ", microtime());

Return ((float)$usec + (float)$sec);

}

?>

その後、インターネットで、redis にはトランザクションと呼ばれる魔法の機能があることを発見しました。これは、マルチを通じてコードのブロックを原子的に順番に実行し、それによって完全な機能モジュールの実行を実現します。残念ながら、テストによると マルチモードでコードを実行すると、リクエストの数は減らないのに、マルチ命令と exec 命令を実行するとリクエストが送信されるため、実行時間が 4 倍になることがわかりました。 4 つの命令の実行時間。テストコードは次のとおりです: redis3.php

//接続

$redis = 新しい Redis();

$redis->connect('127.0.0.1', 6379);

$time_start = microtime_float();

//データを保存します

for($i = 0; $i <100000; $i ++){

$redis->multi();

$redis->sadd("key$i",$i);

$redis->expire("key$i",3);

$redis->exec();

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "かかった時間 $run_time 秒 n";

//接続を閉じます

$redis->close();

関数 microtime_float()

{

List($usec, $sec) =explode(" ", microtime());

Return ((float)$usec + (float)$sec);

}

?>

この問題にはボトルネックがあり、大量のデータ処理を必要とする企業は多くありますが、1 秒あたり 5,000 回では需要を満たすには程遠いです。また、redis マスター/スレーブ サーバーには memcache よりも大きな利点があるためです。 将来のデータのために、redis を使用する必要があります。現時点では、phpredis が提供する pipline 関数という新しい方法が登場しました。これは、複数のコードを実際にカプセル化することができます。 1 回のリクエストで実行速度が大幅に向上し、500,000 回のデータを実行するのにかかる時間はわずか 58 秒です。テストコードは次のとおりです: redis4.php

//接続

$redis = 新しい Redis();

$redis->connect('127.0.0.1', 6379);

$time_start = microtime_float();

//データを保存します

for($i = 0; $i <100000; $i ++){

$pipe=$redis->パイプライン();

$pipe->sadd("key$i",$i);

$pipe->expire("key$i",3);

$replies=$pipe->execute();

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "かかった時間 $run_time 秒 n";

//接続を閉じます

$redis->close();

関数 microtime_float()

{

List($usec, $sec) =explode(" ", microtime());

Return ((float)$usec + (float)$sec);

}

?>

この操作を使用すると、代入操作と有効期限設定操作を 1 つのリクエストに完全にパッケージ化して実行できるため、作業効率が大幅に向上します。

Redis のインストール: http://mwt198668.blog.163.com/blog/static/48803692201132141755962/

memcache のインストール: http://blog.csdn.net/barrydiu/article/details/3936270

Redis設定のマスター/スレーブサーバー: http://www.jzxue.com/fuwuqi/fuwuqijiqunyuanquan/201104/15-7117.html

Memcache はマスター/スレーブ サーバーを設定します: http://www.cnblogs.com/yuanermen/archive/2011/05/19/2051153.html

この記事の引用元: http://blog.csdn.net/a923544197/article/details/7594814

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/802362.html技術記事私自身の使用法について話しましょう。私が最初に使用した memcache は、キーと値の関係のためのサーバー側のキャッシュで、それほど大きくないが、迅速な応答が必要な、一般的に使用されるデータを保存するために使用されます。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート