Класс redis
moko 09.10 22:11
В парсер добавлен класс для работы с redis: клиент Redis поверх библиотеки hiredis. Поддержка (без SSL) уже в ночных сборках (включая Windows и OS X).
Подключение:
$r[^redis::open[ $.host[localhost] $.port(6379) $.password[secret] $.db(1) ]]
Возможные опции подключения:
$.host[localhost] $.port(6379) или $.unix_socket[путь]
$.user[] $.password[] $.db(0) $.timeout(2) $.protocol(3) $.auto_reconnect(секунд)
$.tls[ $.ca[файл] $.cert[файл] $.key[файл] $.verify(true) ]
Отдельных методов под команды нет: любой метод, которого нет у класса, считается командой redis, а его параметры - её аргументами.
^r.set[user:1;moko]
^r.get[user:1]
^r.expire[user:1;3600]
^r.client[SETNAME;my-site]
Последний пример показывает, как пишутся составные команды вроде CLIENT SETNAME. Если имя команды лежит в переменной - есть ^r.call[GET;user:1].
Типы сохраняются в обе стороны, примерно как у json:
- в ответе число приходит как int или double, nil как void, массив как array, map как hash, bool как bool;
- в аргументах строки и числа передаются текстом, bool как 1/0, файл своим содержимым;
- массив в аргументах разворачивается в свои элементы, хеш в пары ключ значение:
^r.hset[user:2;$.name[moko] $.visits(1)]
$user[^r.hgetall[user:2]]
В результате выполнения кода $user будет обычный hash.
Ответ-ошибка (например, WRONGTYPE) превращается в исключение типа redis, которое можно ловить через ^try.
Двоичные данные. Если добавить к имени команды префикс f-, строки ответа выдаются файлами:
^r.set[logo;^file::load[binary;logo.png]]
$logo[^r.f-get[logo]]
Так же работает ^r.f-call[GET;logo].
Таймаут по умолчанию 2 секунды на подключение и на каждую команду, всё-таки мы cgi. $.timeout(0) снимает ограничение.
Обрывы связи - как в amqp. Оборванное соединение бросает исключение. С $.auto_reconnect(N) класс выждет N секунд и переподключится перед следующей командой, повторив AUTH и SELECT; саму неудавшуюся команду он не повторяет.
TLS: $.tls[ $.ca[...] $.cert[...] $.key[...] ]. Для TLS нужен парсер, собранный с системным hiredis, который поддерживает SSL (на Debian это libhiredis-dev, buildall --with-system-redis). В ночных сборках hiredis (как и amqp) собран статически и без SSL, чтобы бинарник не зависел от версии OpenSSL в системе. Сертификат сервера проверяется, только если задан $.ca; имя хоста hiredis не проверяет.
Еще новшество: теперь сразу видно, с какими возможностями собран конкретный парсер: при запуске из консоли он пишет их в первой строке, например "Parser/3.5.2b (compiled on x86_64-pc-linux-gnu) safe-mode xml amqp redis", в случае поддержки SSL будет redis+ssl. Та же строка лежит в $env:PARSER_VERSION.
Соединение закрывается ^r.release[]. В режиме веб-сервера лучше закрывать его явно, само оно не закроется (как и у amqp).
- Класс redis, moko [M] 09.10 22:11