2013-07-05 46 views
4

我必须失去我认为有些事情真的很明显在这里,但我试图做的是使用MySQL 5.6,并通过内存缓存使用MySQL 5.6的Memcache

所以我已经设置了MYSQL返回值使用的内存缓存插件,在innodb_memcache.containers表中设置细节

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

要获得通过PHP数据我用:

$memcache->get($key); 

其中$关键是在数据库列中的数据

然而,这没有返回,我怀疑的原因是,根据MySQL的文档如果没有指定表名,它会选择列表中的第一个,这不是我想要的,我不明白的是我如何在键中指定正确的表名,以便知道要查看哪个表为钥匙英寸

附加信息:

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查询哪些表,我将非常感谢!

+0

要获得答案,您需要指定数据表结构,innodb_memcache.container记录以及您打算如何从Memcache($ key的确切值)检索缓存的数据。 – Mehran

+0

我已添加其他信息以帮助解决此问题 –

回答

3

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

如果在你的映射表名是mycode,然后通过内存缓存结果查询应该是这样的:

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

有结尾没有多余的'.' . $table

一些细节可从InnoDB memcached Plugin文档页面获得。

仅举几重要性在这里:

  1. 使用select * from innodb_memcache.containers;得到定义的映射;
  2. 注意查询机构:

例如,@@ t1.some_key和@@ t2.some_key具有相同的键值, 但存储在不同的表,因此不冲突。

+0

我知道这似乎是正确的,但我无法得到这个工作。我不知道什么是错,遵循了所有步骤,仔细检查你在这里写的是什么,但它仍然没有任何东西 –

-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,到memcached实例的连接,只要PHP和相关的Apache实例运行仍保持开放。在正在运行的实例中添加或删除列表中的服务器时(例如,在启动提及附加服务器的另一个脚本时),连接是共享的,但脚本仅在脚本中显式配置的实例中进行选择。

+0

感谢您的回复,但它并未真正回答我的问题。我的问题是,我试图在5.6中使用新的memcache层查询数据库,但我无法弄清楚我如何指定我输入的密钥应该被查询的表。 –

4

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

命名空间:memcached是像巨单目录,其中从与对方你可以给他们的前缀和后缀名精心冲突的文件保存。集成的InnoDB/memcached服务器允许您使用这些相同的密钥命名约定,只需添加一个。格式@@ table_id.key.table_id的密钥名称被解码以使用来自innodb_memcache.containers表的映射数据来引用特定的表。密钥被查找或写入指定的表格。

@@符号仅适用于个别调用get,add和set函数,而不是其他函数如incr或delete。要指定会话中所有后续memcached操作的默认表,请使用@@表示法和表ID(但不包含关键部分)执行get请求。例如:

得到@@ TABLE_X

后续获取,设置增量,删除等操作使用由TABLE_X在innodb_memcache.containers.name列指定的表。

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 

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