まず私自身の使用法について話させてください:
最初の memcache が使用されます。これは、キーと値の関係のためのサーバー側のキャッシュで、それほど大きくないが、迅速な応答が必要な、一般的に使用されるデータを保存するために使用されます。
redis、memcache、mongoDB 、投票へようこそを比較しました
1、パフォーマンス
それらはすべて比較的高いので、パフォーマンスがボトルネックになることはありません一般に、
TPSの観点から見ると、redisはmemcacheとほぼ同じですが、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:主に大量データのアクセス効率の問題を解決します
$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