static bool test_zadd(acl::redis_zset& redis, int n) { acl::string key; std::map<acl::string, double> members; acl::string member; for (int i = 0; i < n; i++) { key.format("%s_%d", __keypre.c_str(), i); for (int j = 0; j < 1000; j++) { member.format("member_%d", j); members[member] = j; } redis.clear(); int ret = redis.zadd(key, members); if (ret < 0) { printf("add key: %s error\r\n", key.c_str()); return false; } else if (i < 10) printf("add ok, key: %s, ret: %d\r\n", key.c_str(), ret); members.clear(); } return true; }
static bool test_zadd(acl::redis_zset& redis, int i, const char* key, const char* big_data, size_t length, size_t base_length) { // 将大数据进行分割,计算出分割后的数据块个数 size_t nmember = length / base_length; if (length % base_length != 0) nmember++; // 从连接对象中获得统一的内存池分配对象,分配小内存块 acl::dbuf_pool* pool = redis.get_pool(); // 动态分配数据块指针数组内存 const char** members = (const char**) pool->dbuf_alloc(nmember * sizeof(char*)); // 动态分配数据块长度数组内存 size_t* lens = (size_t*) pool->dbuf_alloc(nmember * sizeof(size_t)); // 动态分配数据块分值数组内存 double* scores = (double*) pool->dbuf_alloc(nmember * sizeof(double)); // 将大数据切分成小数据,置入数据块数组中,使用递增的整数做为分值 size_t len; const char* ptr = big_data; char* buf, id[64]; int n; for (size_t j = 0; j < nmember; j++) { len = length > base_length ? base_length : length; // 在每个原始数据前面加唯一前缀,从而可以保证有序集合中对象中 // 的每个成员数据都是不同的 n = acl::safe_snprintf(id, sizeof(id), "%lu:", (unsigned long) j); buf = (char*) pool->dbuf_alloc(len + n); memcpy(buf, id, n); memcpy(buf + n, ptr, len); members[j] = buf; lens[j] = len + n; // 该数据块的总长度:唯一前缀+数据 scores[j] = (double) j; // 剩余数据块长度 length -= len; ptr += len; } // 要求 redis 连接对象采用内存链协议组装方式,避免内部组装请求协议时 // 再组装成大内存 redis.get_client()->set_slice_request(true); // 开始向 redis 添加数据 int ret = redis.zadd(key, members, lens, scores, nmember); if (ret < 0) { printf("add key: %s error\r\n", key); return false; } else if (i < 10) printf("add ok, key: %s, ret: %d\r\n", key, ret); return true; }