使用MYsql 5.6 Memcache

时间:2013-07-05 05:46:58

标签: php mysql memcached

我想我必须遗漏一些非常明显的东西,但我想要做的是使用MySQL 5.6并通过memcache返回值

所以我设置了MYSQL来使用memcache插件,在innodb_memcache.containers表中设置细节

我现在在该表中有两个项目,MySQL输入的默认项目和我自己的设置,它们都有表名。

要通过php获取数据我使用:

  $memcache->get($key);

其中$ key是db列中的数据

然而,这没有任何回报,我怀疑原因是,根据MySQL Docs,如果没有指定表名,它会选择列表中的第一个,这不是我想要的,我不明白的我是如何在键中指定正确的表名,因此它知道要在哪个表中查找键。

其他信息:

table design:
    table: codes
    id INT PK
    code VARCHAR UNIQUE
    codeval VARCHAR


innodb_memcache.containers :
name: mycode
db_schema: databaseName
db_table: codes
key_columns: code
value_columns: codeval
flags: id
cas_column: null
expire_time_column: null
unique_idx_name_on_key: code

代码:

$table = "mycode";
$key = "123456";
 $memcache = new Memcache;
 $memcache->connect($this->CONNECTURL, $this->CONNECTPORT) or die ("Could not connect");
 $version = $memcache->getVersion();
  echo "Server's version: ".$version."<br/>\n";

 $key = "@@" . $table . "." . $key . "." . $table;
 $get_result = $memcache->get($key);

  print_r($get_result);

上面的代码返回服务器版本没有问题,因此连接正常。 print_r($ get_result)返回空白,应该返回值

它确实发出通知:试图获取非对象的属性

因此,如果有人可以让我知道我如何用$ key指定我用来通过memcache查询哪个表,我将不胜感激!

4 个答案:

答案 0 :(得分:4)

来自:http://dev.mysql.com/doc/refman/5.6/en/innodb-memcached-intro.html

  

命名空间:memcached就像一个巨大的目录,在那里保持文件不会相互冲突你可能会给它们带有前缀和后缀的详细名称。集成的InnoDB / memcached服务器允许您对密钥使用这些相同的命名约定,只需添加一个。使用 innodb_memcache.containers 表中的映射数据解码格式 @@ table_id.key.table_id 的键名以引用特定的表。密钥被查找或写入指定的表。

     

@@表示法仅适用于对get,add和set函数的单独调用,而不适用于incr或delete等其他函数。要为会话中的所有后续memcached操作指定默认表,请使用@@表示法和表ID执行get请求,但不使用密钥部分。例如:

     

获取@@ table_x

     

后续的get,set,incr,delete和其他操作使用 innodb_memcache.containers.name 列中table_x指定的表。

答案 1 :(得分:3)

表名(table_id中的@@table_id)必须是映射中的值(innodb_memcache.containers),而不是实际的表名(如果有变化)。

如果映射中的表名是mycode,那么通过 memcache 生成的查询应该如下所示:

$table = 'mycode';
$key   = '123456';
$memcache->get( '@@' . $table . '.' . $key );

最后没有额外的'.' . $table

有些详情可从InnoDB memcached Plugin文档页面获取。

在这里列举一些重要性:

  1. 使用select * from innodb_memcache.containers;获取已定义的映射;
  2. 请注意查询组织:
  3.   

    例如,@@ t1.some_key和@@ t2.some_key具有相同的键值,   但是存储在不同的表中,所以不要冲突。

答案 2 :(得分:0)

如果您仍有默认表,可以尝试使用telnet。

注意:这是在带有memcached的AWS RDS实例上使用的,对于使用memcached的任何MySQL实现,它应该相同,但我不确定。

telnet localhost 11211
stats
#=> should return a long list of stats including pid, uptime, etc

get AA
#=> should return
VALUE AA 8 12
HELLO, HELLO
END

quit #exit telnet session

我知道这不能解答您的问题,但它可能有助于排除故障。

答案 3 :(得分:-2)

<?php

$memc = new Memcache;
$memc->addServer('localhost','11211');

if(empty($_POST['film'])) {
?>
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Simple Memcache Lookup</title>
    </head>
    <body>
      <form method="post">
        <p><b>Film</b>: <input type="text" size="20" name="film"></p>
        <input type="submit">
      </form>
      <hr/>
<?php

} else {

    echo "Loading data...\n";

    $film   = htmlspecialchars($_POST['film'], ENT_QUOTES, 'UTF-8');
    $mfilms = $memc->get($film);

    if ($mfilms) {

        printf("<p>Film data for %s loaded from memcache</p>", $mfilms['title']);

        foreach (array_keys($mfilms) as $key) {
            printf("<p><b>%s</b>: %s</p>", $key, $mfilms[$key]);
        }

    } else {

        $mysqli = mysqli('localhost','sakila','password','sakila');

        if (mysqli_connect_error()) {
            sprintf("Database error: (%d) %s", mysqli_connect_errno(), mysqli_connect_error());
            exit;
        }

        $sql = sprintf('SELECT * FROM film WHERE title="%s"', $mysqli->real_escape_string($film));

        $result = $mysqli->query($sql);

        if (!$result) {
            sprintf("Database error: (%d) %s", $mysqli->errno, $mysqli->error);
            exit;
        }

        $row = $result->fetch_assoc();

        $memc->set($row['title'], $row);

        printf("<p>Loaded (%s) from MySQL</p>", htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
    }
}
?>
  </body>
</html>

使用PHP,只要PHP和关联的Apache实例仍在运行,与memcached实例的连接就会保持打开状态。在正在运行的实例中从列表中添加或删除服务器时(例如,在启动另一个提及其他服务器的脚本时),将共享连接,但脚本仅在脚本中显式配置的实例中进行选择。