2012-04-13 17 views
17

私はencachedを理解しようとしています。MySQLでmemcacheはどのように動作しますか?

私たちは、PHPで開発された大きなWebアプリケーションを実行しているloadbalancerに4つのWebサーバーを持っています。すでにAPCを使用しています。 memcachedの仕組みを見たいですか?少なくとも、私はキャッシングがどのように動作するのか分からないかもしれません。

いくつかのテーブルを結合してデータを取り出す複雑な動的クエリがあります。毎回、データは異なるクライアントデータベースから得られ、データは変化し続ける。私の理解では、キャッシュにいくつかのデータが格納されていて、次回同じ要求があった場合、同じデータが返されます。 (または私はここで完全に間違っているかもしれません)。

どのようにこのmemcache全体(またはそれについては、キャッシュの内容は機能しますか)はどうですか?

答えて

22

キャッシュは一般に、所定のキーで値(通常はシリアル化された値)を格納できる非常に高速なキー/値ストレージエンジンであるため、格納された値を同じキーで取り出すことができます。

MySQLに関しては、データベースにリクエストを発行する前に、キャッシュにデータが存在するかどうかをチェックするような方法でアプリケーションコードを記述します。一致するものが見つかった場合(一致するキーが存在する場合)、そのキーに関連付けられたデータにアクセスできます。目標は、避けることができれば、よりコストのかかるデータベースに要求を出さないことです。

例(実証のみ):

$cache = new Memcached(); 

$cache->addServer('servername', 11211); 

$myCacheKey = 'my_cache_key'; 

$row = $cache->get($myCacheKey); 

if (!$row) { 

    // Issue painful query to mysql 
    $sql = "SELECT * FROM table WHERE id = :id"; 

    $dbo->prepare($sql); 
    $stmt->bindValue(':id', $someId, PDO::PARAM_INT); 

    $row = $stmt->fetch(PDO::FETCH_OBJ); 

    $cache->set($myCacheKey, serialize($row)); 
} 

// Now I have access to $row, where I can do what I need to 
// And for subsequent calls, the data will be pulled from cache and skip 
// the query altogether 
var_dump(unserialize($row)); 

詳細はmemcached上のPHPのドキュメントをチェックし、いくつかの良い例とのコメントがあります。

+0

通常の変数をmemcachedに保存できますか?それは実践ですか? –

+0

具体的に言えば、私は、アプリケーション全体で使用される多くの定数変数を持っています。それらをキャッシュに保存できますか? –

+1

「定数」変数の例を教えてもらえますか?定義によって、定数は動的ではありません。 –

1

memcacheの仕組みに関するいくつかの例があります。 Hereはリンクの1つです。

第2に、MemcacheはMySQLの有無にかかわらず動作できます。

これはPHPにあるオブジェクトをキャッシュします。これは、PHPオブジェクトであれば、MySQLや他の場所からでも、MemCacheに格納できます。

APCでは、Memcacheよりもさらに機能があります。 PHPオブジェクトを格納/キャッシュする以外に、PHP実行可能ファイルがキャッシュ可能なので、PHPファイルはメモリにロードされるプロセスを経由せず、コンパイルされたオペコードを直接実行しますメモリから。

+0

ありがとうございました!私の質問ははっきりしないと思います。これは、クエリであると言うことができます: ' ** SELECT名前、人から年齢** ' code' 、これが結果です: 'code' Krish、45 ジョシュ、25 ケビン、60 'コード' 次回は、私は同じクエリを呼び出すときに、それが返されることがあります: ' code' ジョー、45 ジェイ、25 クリス、60再投稿のため申し訳ありません 'code' –

+0

: 感謝!私の質問ははっきりしないと思います。 、 ' Krish、45 ジョシュ、25 ケビン、60 ' 次の時間:SELECT名前、人から年齢** ' 、これが結果です** ' :これはクエリであると言うことができます私は、同じクエリを呼び出すときに、それが返されることがあります: ' ジョー、45 ジェイ、25の クリス、60 ' どのようにここでのキャッシングに動作しますか?クエリはどのようにキャッシュされますか? –

+2

このクエリにはキャッシュから回答することはできません。キャッシングは、以前の要求以降にデータが変更されていないことを前提としています。実際には、高速アクセスのために一部のデータを一時的にメモリに保存しています。このように見てください:名前が "Kev"で始まり、25歳以上のデータベース内のすべての人物を見るためのリクエストをしたばかりの人は、初めてMySQLにリクエストする必要があります。結果を取得します。これらの結果をキャッシュするようにアプリケーションに指示した場合、次に*正確な*同じクエリを実行すると、単にキャッシュから回答することができます。データが異なる場合、これは機能しません。 – Daan

1

データが(リクエスト間で)変化し続ける場合、そのデータは失効するため、キャッシングは無駄です。しかし、ほとんどの場合(私はあなたのキャッシュでさえも)、データベースへの複数のリクエストが同じデータセットをもたらす場合、キャッシュ(メモリ内)は非常に便利です。

P.S:私は素早くgoogle検索を行い、memcachedについてこのビデオを見つけました。これはかなり良い品質=>http://www.bestechvideos.com/2009/03/21/railslab-scaling-rails-episode-8-memcachedです。唯一の問題はRuby On Rails(これもあまり使用しませんが、わかりやすい)に関することです。うまくいけば、コンセプトを少しでも良くするのに役立つでしょう。

+0

ありがとうございました!このビデオは参考になります! –

関連する問題