|
t num_col = meta->getColumnCount();
// 将结果集中所有行对应的所有HASH键存入该SET,SET键包含了结果集的标识符
string redis_row_set_key("resultset.hash:" + resultset_id);
redisReply *reply;
string ttlstr;
stringstream ttlstream;
ttlstream << ttl;
ttlstr = ttlstream.str();
// 结果集中的每一行对应于一个HASH,将结果集的所有行都存入相应HASH中
resultset->beforeFirst();
while (resultset->next()) {
string redis_row_key; // HASH键名,由前缀和HASH编号组成
stringstream keystream;
keystream << prefix << num_row;
redis_row_key = keystream.str();
for (int i = 1; i <= num_col; ++i) {
string col_label = meta->getColumnLabel(i);
string col_value = resultset->getString(col_label);
// 将结果集中一行的字段名和对应值存入HASH
reply = static_cast(redisCommand(redis_connection,
"HSET %s %s %s",
redis_row_key.c_str(),
col_label.c_str(),
col_value.c_str()));
freeReplyObject(reply);
}
// 将HASH键加入SET中
reply = static_cast(redisCommand(redis_connection,
"SADD %s %s",
redis_row_set_key.c_str(),
redis_row_key.c_str()));
freeReplyObject(reply);
// 设置HASH的过期时间
reply = static_cast(redisCommand(redis_connection,
"EXPIRE %s %s",
redis_row_key.c_str(),
ttlstr.c_str()));
freeReplyObject(reply);
++num_row;
}
// 设置SET的过期时间
reply = static_cast(redisCommand(redis_connection,
"EXPIRE %s %s",
redis_row_set_key.c_str(),
ttlstr.c_str()));
freeReplyObject(reply);
return redis_row_set_key; // 返回SET键,以便于其他函数获取该SET中的内容
}
至此,我们已经给出了两种存储Mysql结果集的方案,这就是我们在篇首提出的第一个问题,即选择何种数据结构存储Mysql结果集的答案。下一篇文章将研究第二个问题,即数据结构键的标识符选择问题。
|