Я пытаюсь сохранить данные JSON в Redis через PHP, но тестирую их через клиент командной строки redis-cli.
В обоих клиентах мне кажется, что я не могу сохранить JSON, не избежав его каким-либо образом.
redis 127.0.0.1:6379> set test1 {"array":[1,2,3],"number":123,"object":{"a":"b","c":"d","e":"f"},"string":"Hello World"}
Invalid argument(s)
Не работает
redis 127.0.0.1:6379> set test1 '{"array":[1,2,3],"number":123,"object":{"a":"b","c":"d","e":"f"},"string":"Hello World"}'
Invalid argument(s)
Пробовал одинарные кавычки. Не работает
redis 127.0.0.1:6379> set test1 \{\"array\"\:\[1\,2\,3\]\,\"number\"\:123\,\"object\"\:\{\"a\"\:\"b\"\,\"c\"\:\"d\"\,\"e\"\:\"f\"\},\"string\"\:\"Hello World\"\}
Invalid argument(s)
Пытался избежать всего с помощью обратной косой черты. Не работает
redis 127.0.0.1:6379> "\{\"array\"\:\[1\,2\,3\]\,\"number\"\:123\,\"object\"\:\{\"a\"\:\"b\"\,\"c\"\:\"d\"\,\"e\"\:\"f\"\},\"string\"\:\"Hello World\"\}"OK
Пробовал избегать всего с обратными слешами и в двойных кавычках.
И это работает!
redis 127.0.0.1:6379> get test1
"{\"array\":[1,2,3],\"number\":123,\"object\":{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"},\"string\":\"Hello World\"}"
Теперь в serialize () или json_encode () есть простой параметр, который позволяет этому происходить автоматически,
ИЛИ ЖЕ
Я должен написать пользовательскую функцию, используя preg_replace (), чтобы добавить косые черты при сохранении, а затем удалить косые черты при извлечении, и надеюсь, что нет особых хитрых данных, которые нарушат мой код на основе регулярных выражений.
Я чувствую, что второй вариант действительно не рекомендуется, если есть правильный способ сделать это.
Любые идеи, что будет такой вариант?
Я не могу использовать Predis (я пытался https://github.com/nrk/predis/tree/php5.2_backport потому что я работаю на PHP 5.2) но потом нашел https://github.com/joelcox/codeigniter-redis и он отлично работает для всех основных типов данных.
Итак, что такое опция / параметр для serialize () / json_encode (), которая разрешает строку, которую redis-cli не отклонит?
Ну, получается, что линия 118 в https://github.com/joelcox/codeigniter-redis/blob/develop/libraries/Redis.php
public function command($string)
{
$slices = explode(' ', $string); /* <-- HERE */
$request = $this->_encode_request($slices[0], array_slice($slices, 1));
return $this->_write_request($request);
}
вслепую разделял всю команду космическим персонажем.
Так как в моих данных были пробелы (чего нет в реальных данных …), это нарушало синтаксис Redis CLI.
Поэтому мне пришлось экранировать пробелы (заменяемые пользовательской строкой), чтобы заставить его работать должным образом.
Других решений пока нет …