1

次のコードを検討してください。

function getUser($uid) {
    global $_memcache;
    $u = $_memcache->get("user-".$uid);
    if( !$u) {
        $u = ... // get user from database
        $_memcache->set("user-".$uid,$u);
    }
    return $u;
}

さて、この関数はおそらくLOTと呼ばれます。たとえば、フォーラムでは、1 回のページ読み込みで 30 回以上呼び出される場合があります。次のことを行う価値はありますか、または Memcache はすでに十分に最適化されていますか?

function getUser2($uid) {
    static $localcache = [];
    if( isset($localcache[$uid])) return $localcache[$uid];
    return $localcache[$uid] = getUser($uid);
}
4

2 に答える 2

0

Kolink、Mikeに別の見方をしたいと思います。まず、getUserリクエストの数が1ページあたり約50、または数百のオーダーである場合、ストレージの問題は重要ではありません。

次に、memcachedのプロセスが不足しているため、memcachedが同じシステム上にある場合でも、get()呼び出しごとに2つのユーザーモードコンテキストスイッチが発生するため、ここでの重要な問題は単純な統計上の問題です。ページあたりのユーザーオカレンスの数?たとえば、これが2の場合、ローカルPHPキャッシュはmemcached関連のコンテキストスイッチの数の半分になります。

ただし、実際の節約は、memcachedマルチ取得機能を利用することで実現されます。PHPmemcache拡張機能は、値の配列を使用してmemcache :: get()を呼び出す場合にこれを使用します。ただし、これには2パスアルゴリズムとコードへのいくつかの変更が必要です。これを安全に行う1つの方法は、2番目の例のようにローカルにキャッシュされたgetUser()を使用することですが、ページ構造の0回目のパススキャンを追加して推定memcache getターゲットを検出し、一意の並べ替えを行ってから、ローカルキャッシュをmulti-このリストに基づいて取得します。

メインラインは、キャッシュされたgetとfaultを使用してD / Bに戻り、memcacheにuser-XXXを設定できますが、この方法では、ユーザークエリの多く(たとえば95%)が1つのアウトプロセスで満たされます。 memcachedを呼び出します。

はい、少し複雑になりますが、パフォーマンスの向上により、試してみる価値は十分にあると思います。

于 2012-07-18T23:54:14.197 に答える
0

Well ultimately memcached is in memory storage, just as storing the values in PHP array would be. If the memcached instance is on the same server that you are running the code on, then I would definitely say just use memcached instead of both memcached and the PHP array, as you would end up just using ~ twice as much memory on the machine by storing the same data in memory twice.

If memcached is on seperate infrastructure (which is probably likely), then I guess I would consider what the size of the data stored for the user is going to be. If it is large and you may store a large number of users in the PHP array, it means you could potentially be sucking up more memory on your web server than you find desirable, in which case accessing the data from memcached repeatedly, while being slightly slower for overall access time, would probably provide significant application performance under server load.

Personally, I would probably tend to lean towards relying on memcached for each request, as it is just more scalable.

于 2012-07-18T18:31:14.280 に答える