Мне кажется, что мне не хватает чего-то действительно очевидного, но я пытаюсь использовать 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 .
Чтобы назвать несколько важных здесь:
select * from innodb_memcache.containers;
для получения определенных отображений; Например, @@ 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 будут работать. При добавлении или удалении серверов из списка в запущенном экземпляре (например, при запуске другого скрипта, который упоминает дополнительные серверы), соединения являются общими, но сценарий выбирает только те экземпляры, которые явно сконфигурированы в скрипте.