В продолжение статьи Первый опыт работы с Handler Socket & php_handlersocket некоторые особенности Update & Insert
Некоторое время было потрачено на использование UPDATE & INSERT.
все тестировалось на простой таблице
Простой пример
выдавал
Оказывется, ларчик открывался просто:
Если мы посмотрим SHOW PROCESSLIST

то строчка 17 колонки State в режиме mode отличается от всех предыдущих строк:
Как упоминалось в статье Первый опыт работы с Handler Socket & php_handlersocket при запуске HandlerSocket стартует 16 читающих тредов и один пишущий. Эти данные устанавливаются в my.cnf
так вот, читающие треды (потоки) забиндены на порт 9998, а пишущий на порт 9999. По этому, если Вы собираетесь производить операции INSERT/UPDATE/DELETE Вы должны открыть индекс на 9999 порту
Аналогично и с нативным протоколом:
с операциями INSERT/UPDATE получаем ошибку readonly
Теперь код из листинга 1 даст положительный результат:
В заключение небольшое тестирование MacX 2Gb 2.3 GHz CoreDuo, ни что специально не затачивалось (установки дефолтные).
Осуществлялась запись/чтение 100 000 записей по 32 байта в memcache,redis,memcacheDb, hs,Totyo Tyrant
в одном потоке, одной коннекции, нативный протокол.
Результаты:
Время в сек, производилось в среднем по 3-5 замеров.
* — на читающий порт
** — на пишущий порт
что еще хотелось бы сравнить: membase & tarantool
Некоторое время было потрачено на использование UPDATE & INSERT.
все тестировалось на простой таблице
CREATE TABLE `test`.`test` (
`keyid` varchar(45),
`value` varchar(45),
PRIMARY KEY (`keyid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
Простой пример
$port = 9998;
$hs = new HandlerSocket($host, $port);
$retval = $hs->executeInsert(0, array( '112233090', '12212212'));
var_dump($retval);
* This source code was highlighted with Source Code Highlighter.
выдавал
bool(false);
Оказывется, ларчик открывался просто:
Если мы посмотрим SHOW PROCESSLIST

то строчка 17 колонки State в режиме mode отличается от всех предыдущих строк:
mode=rd
mode=wr
Как упоминалось в статье Первый опыт работы с Handler Socket & php_handlersocket при запуске HandlerSocket стартует 16 читающих тредов и один пишущий. Эти данные устанавливаются в my.cnf
loose_handlersocket_threads = 16
# the number of worker threads (for read requests)
loose_handlersocket_threads_wr = 1
# the number of worker threads (for write requests)
так вот, читающие треды (потоки) забиндены на порт 9998, а пишущий на порт 9999. По этому, если Вы собираетесь производить операции INSERT/UPDATE/DELETE Вы должны открыть индекс на 9999 порту
$host = 'localhost';
$port = 9998;
$port_wr = 9999;
$hs = new HandlerSocket($host, $port_ wr);
* This source code was highlighted with Source Code Highlighter.
Аналогично и с нативным протоколом:
telnet akalend.local 9998
tеlnet: connect to address fe80::217:f2ff:feee:3a60: Connection refused
Trying 192.168.1.10...
Connected to akalend.local.
Escape character is '^]'.
P 0 test test PRIMARY keyid,value
0 1
0 = 1 123123
0 2 123123 asdasdasd
0 = 1 123123 0 0 D
2 1 readonly
с операциями INSERT/UPDATE получаем ошибку readonly
telnet akalend.local 9999
Trying fe80::217:f2ff:feee:3a60...
telnet: connect to address fe80::217:f2ff:feee:3a60: Connection refused
Trying 192.168.1.10...
Connected to akalend.local.
Escape character is '^]'.
P 0 test test PRIMARY keyid,value
0 1
0 = 1 123123 1 0 D
0 1 1
0 + 2 1111 12345
0 1
Здесь как видно все проходит отлично.Теперь код из листинга 1 даст положительный результат:
bool(true)
В заключение небольшое тестирование MacX 2Gb 2.3 GHz CoreDuo, ни что специально не затачивалось (установки дефолтные).
Осуществлялась запись/чтение 100 000 записей по 32 байта в memcache,redis,memcacheDb, hs,Totyo Tyrant
в одном потоке, одной коннекции, нативный протокол.
Результаты:
noSql | set | get |
---|---|---|
HS | 33,4 | 24,6*/26,3** |
Mc | 16,7 | 15,6 |
McDb | 21,4 | 17,5 |
redis | 19,4 | 19,6 |
TokyoTr | 22,1 | 22,8 |
Время в сек, производилось в среднем по 3-5 замеров.
* — на читающий порт
** — на пишущий порт
что еще хотелось бы сравнить: membase & tarantool