redisスペース問題

1597 ワード

redisで遭遇したスペースの問題をメモします.
hsetを使用する場合、キーまたは値にスペースがある場合は、次のようにカプセル化されたhmsetメソッドでは、常に成功しません.
int CRedisIntf::hash_mset(const string& key, const vector& fields, const vector& values)
{
	if (key.empty() || fields.empty() || values.empty())
	{
		return -1;
	}

	string strFormat = "HMSET " + key + " ";
	for (size_t i = 0; i < fields.size(); ++i)
	{
		if (fields[i].empty())
		{
			return -1;
		}
		strFormat += fields[i] + " ";
		strFormat += values[i] + " ";
	}
	if (!_check_connect())
	{
		return -1;
	}
    mcgWriteLog("CRedisIntf::hash_mset %s",strFormat.c_str());
	redisAppendCommand(m_pRedis,strFormat.c_str());
	redisReply* reply = NULL;
	redisGetReply(m_pRedis,(void**)&reply);
	if (reply == NULL)
	{
		redisFree(m_pRedis);
		m_pRedis = NULL;
		return -1;
	}

	if (reply->type == REDIS_REPLY_STATUS && strcmp(reply->str,"OK") == 0)
	{
		freeReplyObject(reply);
		return 0;
	}
	else
	{
		freeReplyObject(reply);
		return -1;
	}
}

問題点:
	strFormat += fields[i] + " ";
	strFormat += values[i] + " ";

redisが提供するライブラリは、パラメータをスペースで区切るもので、1つの文字列自体にスペースがある場合、最終的に組み立てが完了すると2つのパラメータに等しいため、キーと値の数が対応しない関係が発生し、偶然に対応しても期待した結果ではないに違いありません.
解決策:
1.置換hsetメソッドを呼び出す前に、キーまたは値のスペースを指定した文字(例えば「」-->「0 x 00」)に置換し、読み出し時(「0 x 00」) -->"").
2.符号化、実は方法1と似ている(valuse= Base64Encode(args,valuse)) 
スペースを消せばいいのです