const redis_result* redis_client::run(dbuf_pool* pool, const redis_request& req, size_t nchildren) { // 重置协议处理状态 bool retried = false; redis_result* result; struct iovec* iov = req.get_iovec(); size_t size = req.get_size(); while (true) { if (!conn_.opened() && conn_.open(addr_, conn_timeout_, rw_timeout_) == false) { logger_error("connect server: %s error: %s", addr_, last_serror()); return NULL; } if (size > 0 && conn_.writev(iov, (int) size) == -1) { conn_.close(); if (retry_ && !retried) { retried = true; continue; } logger_error("write to redis(%s) error: %s", addr_, last_serror()); return NULL; } if (nchildren >= 1) result = get_redis_objects(pool, nchildren); else result = get_redis_object(pool); if (result != NULL) return result; conn_.close(); if (!retry_ || retried) break; retried = true; } return NULL; }
redis_result* redis_client::get_redis_objects(dbuf_pool* pool, size_t nobjs) { acl_assert(nobjs >= 1); redis_result* objs = new(pool) redis_result(pool); objs->set_type(REDIS_RESULT_ARRAY); objs->set_size(nobjs); for (size_t i = 0; i < nobjs; i++) { redis_result* obj = get_redis_object(pool); if (obj == NULL) return NULL; objs->put(obj, i); } return objs; }
const redis_result* redis_client::run(dbuf_pool* pool, const string& req, size_t nchildren) { // 重置协议处理状态 bool retried = false; redis_result* result; while (true) { if (open() == false) return NULL; if (!req.empty() && conn_.write(req) == -1) { close(); if (retry_ && !retried) { retried = true; continue; } logger_error("write to redis(%s) error: %s", addr_, last_serror()); return NULL; } if (nchildren >= 1) result = get_redis_objects(pool, nchildren); else result = get_redis_object(pool); if (result != NULL) return result; close(); if (!retry_ || retried) break; retried = true; } return NULL; }
redis_result* redis_client::get_redis_array(dbuf_pool* pool) { buf_.clear(); if (conn_.gets(buf_) == false) return NULL; redis_result* rr = new(pool) redis_result(pool); rr->set_type(REDIS_RESULT_ARRAY); int count = atoi(buf_.c_str()); if (count <= 0) return rr; rr->set_size((size_t) count); for (int i = 0; i < count; i++) { redis_result* child = get_redis_object(pool); if (child == NULL) return NULL; rr->put(child, i); } return rr; }