初学Redis(4)――简单实现Redis缓存中的排序功能(二)
ortedCache(sql::Connection *mysql_connection,
redisContext *redis_connection,
const string &sql, const string &sort_field,
int offset, int count, int order, int ttl) {
vector redis_row_key_vector;
redisReply *reply;
string resultset_id = md5(sql); // 结果集标识符
string field_md5 = md5(sort_field); // 排序字段标识符
// 尝试获取LIST中的所有HASH键
string redis_sorted_list_key = "sorted:" + resultset_id + ":" + field_md5;
// 尝试获取LIST中的所有HASH键
reply = static_cast(redisCommand(redis_connection,
"LRANGE %s %s %s",
redis_sorted_list_key.c_str(),
"0",
"-1"));
if (reply->type == REDIS_REPLY_ARRAY) {
// 如果LIST不存在,调用Cache2Hash函数从Mysql中拉取数据到Redis,然后调用SortHash函数
// 对结果集进行排序并将排序后的HASH键存入LIST
if (reply->elements == 0) {
freeReplyObject(reply);
sql::Statement *stmt = mysql_connection->createStatement();
sql::ResultSet *resultset = stmt->
executeQuery(sql);
Cache2Hash(mysql_connection, redis_connection, resultset,
resultset_id, ttl);
redis_sorted_list_key = SortHash(mysql_connection, redis_connection,
resultset_id, sort_field, offset,
count, order, ttl);
// 再次尝试获取LIST中的所有HASH键
reply = static_cast(redisCommand(
redis_connection,
"LRANGE %s %s %s",
redis_sorted_list_key.c_str(),
"0",
"-1"));
delete resultset;
delete stmt;
}
// 将LIST中的所有HASH键存入redis_row_key_vector中
string redis_row_key;
for (int i = 0; i < reply->elements; ++i) {
redis_row_key = reply->element[i]->str;
redis_row_key_vector.push_back(redis_row_key);
}
freeReplyObject(reply);
} else {
freeReplyObject(reply);
throw runtime_error("FAILURE - LRANGE error");
}
return redis_row_key_vector;
} 这样,在Redis中对结果集进行简单排序操作的功能就实现了。