2013-07-05 48 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 

我知道這並不回答您的問題,但它可能有助於排除故障。