0

私はfriendship_requestデータベーステーブルを持っています。たとえば、tomに関するリクエストを検索しようとしたときに、このテーブルに100万レコードがある場合、実際にはこれらの100万レコードにtomの友情リクエストがないため、インデックスを作成する方が適切です。 memcacheで、誰かがtomにリクエストを送信し、最初にmemcacheでtomをチェックしようとすると、データベースに移動して検索クエリを実行します。または、最初にmemcacheをチェックせずに直接検索クエリを作成するには、どちらが高速ですか?ありがとう

4

1 に答える 1

2

最初にMemcacheをチェックする方が速くなります。名前が当てはまるように、アイテムはメモリに保存され、データベースで検索するよりもI/Oが少なくなります。ただし、サーバーのRAMがいっぱいになると、Memcachedはデータを削除します。このため、Memcacheに配置されたデータがまだそこにあると想定するのは賢明ではありません。アイテムの期限が切れる前でも。

ほとんどのMemcacheラッパーとAPIは、FALSEまたはNOT_FOUNDを返します。したがって、アプリケーションは、要求されたアイテムが保存されているかどうかを識別し、保存されていない場合はデータベースを確認する必要があります。データベース検索が完了したら、結果をMemcachedに記録するか、結果を記録しないでください。これにより、アプリケーションが同じ検索を再実行するのを防ぐことができます。

Memcachedとの簡単なやり取りは次のとおりです

shell ~> telnet localhost 11211
tel ~> get tom
       NOT_FOUND

tel ~> set tom 0 86400 5
    ~> 1,2,3
       STORED

tel ~> get tom
       VALUE tom 0 5
       1,2,3
       END

そして、簡単なPHPクラスの例

<?php
class FriendshipRequest extends Memcache {

    const KEY_PREFIX = 'fr_' ; // Use constant prefix to create namespace
    const FLAG = 0;            // Flag for memechache storage option
    const EXPIRE = 86400;      // Store for one day

    public function __construct() {
    $this->addServer('localhost',11211);
    }

    public function __destruct() {
        $this->close();
    }

    /**
     * Find a name
     *
     * First check memcached. If not found,
     * search database, and store results
     * in a JSON string
     *
     * @param string $name
     * @return array
     */
    public function find($name) {
            $key = $this->toKey($name);
            $results = $this->get($key);
            if( $results === false ) {
                    $results = $this->databaseSearch($name);
                    $this->set($key,json_encode($results),self::FLAG,self::EXPIRE);
            } else {
                    $results = json_decode($results);
            }
            return $results;
    }

    /**
     * Run a database search, and return array of matching ID's
     * @param string $name
     * @return array
     */
    private function databaseSearch($name) {
            $sql = sprintf('SELECT `friend_id` FROM `friendship_request` WHERE `friend_name` LIKE "%s"', mysql_real_escape_string($name));
            $matches = array();
            // Database connection omitted
            $results = mysql_query($sql);
            while( $row = mysql_fetch_object($results) ) {
             array_push($matches,$results->friend_id);
            }
            mysql_free_result($results);
            return $matches;
    }

    /**
     * Create a namespace for key
     * @param string $name
     * @return string
     */
    private function toKey($name) {
            return self::KEY_PREFIX.sha1($name);
    }
}
于 2012-07-26T16:38:11.647 に答える