初学Redis(4)――简单实现Redis缓存中的排序功能(二)

2014-11-24 14:25:58 · 作者: · 浏览: 1
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中对结果集进行简单排序操作的功能就实现了。