// 该函数根据sql语句在Redis中查询相应的结果集,并返回结果集中每一行所对应的数据结构的键
vector<string>GetCache(sql::Connection *mysql_connection,
redisContext *redis_connection,
const string &sql, int ttl, int type) {
vector<string>redis_row_key_vector
string resultset_id = md5(sql) // 计算sql语句的md5,这是唯一标识结果集的关键
// type==1时,该函数将查询相应的STRING集合或将结果集写入若干STRING
string cache_type = (type == 1) ? "string" : "hash"
// 根据type信息和结果集标识符合成SET键
string redis_row_set_key = "resultset." + cache_type + ":" + resultset_id
redisReply *reply
// 尝试从reply中获取SET中保存的所有键
reply = static_cast<redisReply*>(redisCommand(redis_connection,
"SMEMBERS %s",
redis_row_set_key.c_str()))
if (reply->type == REDIS_REPLY_ARRAY) {
// 如果要找的SET不存在,说明Redis中没有相应的结果集,需要调用Cache2String或
// Cache2Hash函数把数据从Mysql拉取到Redis中
if (reply->elements == 0) {
freeReplyObject(reply)
sql::Statement *stmt = mysql_connection->createStatement()
sql::ResultSet *resultset = stmt->executeQuery(sql)
if (type == 1) {
redis_row_set_key = Cache2String(mysql_connection, redis_connection,
resultset, resultset_id, ttl)
} else {
redis_row_set_key = Cache2Hash(mysql_connection, redis_connection,
resultset, resultset_id, ttl)
}
// 再次尝试从reply中获取SET中保存的所有键
reply = static_cast<redisReply*>(redisCommand(redis_connection,
"SMEMBERS %s",
redis_row_set_key.c_str()))
delete resultset
delete stmt
}
// 把SET中的每个STRING或HASH键存入redis_row_key_vector中
string redis_row_key
for (int i = 0i <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 - SMEMBERS error")
}
return redis_row_key_vector
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)