web-dev-qa-db-ja.com

MemcacheとJavaメモリ

単純な、おそらく馬鹿げた質問:私がJavaを使用して、クエリに使用できる一般的に使用されるキーと値をメモリに格納するサーバーがあるとします(HashMapで言うとしましょう)

それとMemcache(またはRedis)を使用することの違いは何ですか?どちらも物事をメモリに保存します。どちらか一方にメリットはありますか? Memcacheのメモリフットプリントは少なくなりますか?より少ないメモリでより多くを保存できますか?クエリが高速ですか?変わりはない?

53
Henley Chiu

Javaメモリの利点:

  1. Javaメモリはより高速です(ネットワークなし)。
  2. Javaメモリはシリアル化を必要とせず、Javaオブジェクトを使用できます。

Javaメモリ:memcacheの利点:

  1. 複数のアプリケーションサーバーからアクセスできるため、キャッシュはすべてのアプリサーバーで共有されます。
  2. キースキームとシリアライゼーションにすべて同意している限り、さまざまなサーバーからアクセスできます。
  3. 期限切れのキャッシュ値は破棄されるため、時間ベースの無効化が行われます。
49
Ned Batchelder

並行ハッシュマップ、memcached、MySQLのベンチマークを作成しました。

HashMap vs. memcached vs. MySQL

結果は次のとおりです。

タイプ挿入ルックアップ削除

ConcurrentHashMap 264ms 93ms 82ms

Memcached 6549ms 5976ms 4900ms

Mysql 55754ms 26002ms 57899ms

このベンチマークにはスレッドプールが使用されました。

いくつかの詳細情報はここにあります: http://www.incentergy.de/2013/12/big-data-architecture-patterns-for-performance/

さらに、次のキャッシュはmemcachedの代わりになる可能性があります: https://code.google.com/p/kitty-cache/

27
Manuel_B

それはあなたが何を望んでいるかに依存します。インメモリマップはより高速になります。データの期限切れは実際には問題ではありません(参照:Google Guavaの MapMaker 。これにより、読み取りや書き込みの後にエントリを期限切れにするマップを作成できます。 OSCache のようなことを忘れないでください=および EHCacheGigaSpaces XAP または Coherence )などの分散されたものは言うまでもありません。

キャッシュプロジェクト(XAP、OSCache、EhCache、Coherenceなど)はキャッシュエントリを分散できるため、自然なシャーディングやその他の機能を利用できます。 Coherenceはトランザクションとライトスルーを管理でき、XAPは実際にはレコードのシステムとして機能するように設計されています(XAPへの書き込みは同期および複製されるため、実際のデータストレージメカニズムとしてではなく、メモリ内データグリッドを使用します)データベースを使用します。)

Memcachedは...一連のマシンからmemcachedサーバーインスタンスにアクセスできます。 APIとしてのMemcachedは単なるキー/値ストアであり、配布は完全にクライアント側で行われます。それは確かに基本を持っていると思います、そしてそれは間違いなく複数の言語APIを持っていますが、それ以外の場合は本当にかなりリンプです。

(ところで、GigaSpacesにはMemcachedレイヤーがあるため、理論的にはmemcachedを記録システムとして使用できます...)

16
Joseph Ottinger