Использование MYsql 5.6 Memcache

Мне кажется, что мне не хватает чего-то действительно очевидного, но я пытаюсь использовать MySQL 5.6 и возвращать значения через memcache

Поэтому я настроил MYSQL для использования плагина memcache, настроил детали в таблице innodb_memcache.containers

У меня теперь есть две позиции в этой таблице, по умолчанию введенные MySQL и мои собственные настройки, обе из них имеют имена таблиц.

Чтобы получить данные через php, я использую:

$memcache->get($key); 

Где $ key – данные в столбце db

Однако это ничего не возвращает, я подозреваю, что причина в том, что в соответствии с документами 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) возвращает пустое значение, когда оно должно возвращать значение

Он бросает уведомление: попытка получить свойство не объекта

Поэтому, если кто-то может сообщить мне, как я указываю ключ $, какую таблицу я использую для запроса через memcache, я был бы очень благодарен!

Имя таблицы ( table_id в @@table_id ) должно быть значением из ваших сопоставлений ( innodb_memcache.containers ), а не фактическим именем таблицы, если это варьируется.

И если имя таблицы в сопоставлениях является mycode , то полученный запрос через memcache должен выглядеть так:

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

Больше нет '.' . $table '.' . $table '.' . $table в конце.

Некоторые сведения можно найти на странице документации плагина InfoDB memcached .

Чтобы назвать несколько важных здесь:

  1. Используйте select * from innodb_memcache.containers; для получения определенных отображений;
  2. Обратите внимание на организацию запросов:

Например, @@ t1.some_key и @@ t2.some_key имеют одинаковое значение ключа, но хранятся в разных таблицах и поэтому не конфликтуют.

От: 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 в сеансе, выполните запрос получения с использованием нотации @@ и идентификатора таблицы, но без ключевой части. Например:

get @@ table_x

Последующие операции get, set, incr, delete и другие операции используют таблицу, обозначенную table_x в столбце innodb_memcache.containers.name .

Если у вас все еще есть таблицы по умолчанию, вы можете попробовать использовать telnet.

Примечание. Это использовалось на экземпляре AWS RDS с memcached, оно должно быть одинаковым для любой реализации MySQL с использованием memcached, но я не уверен.

 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 

Я знаю, что это не отвечает на ваш вопрос, но может помочь в устранении неполадок.

 <?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 будут работать. При добавлении или удалении серверов из списка в запущенном экземпляре (например, при запуске другого скрипта, который упоминает дополнительные серверы), соединения являются общими, но сценарий выбирает только те экземпляры, которые явно сконфигурированы в скрипте.