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