使用memcached和mysql搜索查询的最佳实践?

使用memcached和mysql搜索查询的最佳实践?,mysql,memcached,Mysql,Memcached,我有一个请求数据库表,如果这个表有一百万条记录 例如,当我尝试搜索关于tom的请求时,实际上在这百万记录中没有关于tom的友谊请求,那么哪一个更好: 当有人向tom发送请求时,在memcache中建立索引,然后首先尝试检查memcache中是否有tom,如果有,则转到数据库并进行搜索查询。 或者直接进行搜索查询,而无需先检查memcache 哪个更快? 谢谢首先检查Memcache会更快。与名称相同,项存储在内存中,其I/O比数据库查找少。但是,如果服务器的RAM已满,Memcached将逐出任

我有一个请求数据库表,如果这个表有一百万条记录 例如,当我尝试搜索关于tom的请求时,实际上在这百万记录中没有关于tom的友谊请求,那么哪一个更好: 当有人向tom发送请求时,在memcache中建立索引,然后首先尝试检查memcache中是否有tom,如果有,则转到数据库并进行搜索查询。 或者直接进行搜索查询,而无需先检查memcache 哪个更快? 谢谢

首先检查Memcache会更快。与名称相同,项存储在内存中,其I/O比数据库查找少。但是,如果服务器的RAM已满,Memcached将逐出任何数据。出于这个原因,假设Memcache中的任何数据仍然存在是不明智的。甚至在项目的时间到期之前

大多数Memcache包装器和API将返回FALSE或NOT-FOUND。因此,您的应用程序只需确定您请求的项目是否已存储,如果未存储,请检查数据库。完成数据库搜索后,只需在Memcached中记录结果,或者不记录结果。这将阻止应用程序再次运行相同的搜索

这里有一个与Memcached的快速交互

shell~>telnet本地主机11211
打电话给汤姆
找不到
电话~>设置汤姆0864005
~> 1,2,3
存储
打电话给汤姆
价值0.5
1,2,3
结束
还有一个简单的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);
    }
}