我试图通过PHP在Redis中存储JSON数据,但是通过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()中有一个简单的参数,它允许这种情况自动发生,
OR
我必须使用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不会拒绝的字符串?
答案 0 :(得分:0)
嗯,事实证明https://github.com/joelcox/codeigniter-redis/blob/develop/libraries/Redis.php
处的第118行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语法。
所以我必须转义空格(替换为自定义字符串)才能使其正常工作。