Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
但对于整个数组的存储是不支持的,但是由于其支持存储字符串,我们可以把数组进行序列化,然后存储到redis中,读取时,再将其反序列化,可以得到原本的数组数据。
序列化工具采用boost库中的serialization。
#include <windows.h>
#include <iostream>
#include <sstream>
#include <string>
#include <boost\archive\xml_iarchive.hpp>
#include <boost\archive\xml_oarchive.hpp>
#include <boost\archive\binary_iarchive.hpp>
#include <boost\archive\binary_oarchive.hpp>
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
#include <boost\serialization\array.hpp>
#include <boost\array.hpp>
#include "hiredis\hiredis.h"
#include "CRedisClient.h"
using namespace std;
stringstream ss;
int main()
{
WSADATA wsaData;
int nRet;
if ((nRet = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
std::cout << "WSAStartup failed" << std::endl;
exit(0);
}
string data ;
boost::array<float, 100> a;
boost::array<float, 100> b;
//float *a = new float[12800 * 20];
//float *b = new float[12800 * 20];
for (size_t i = 0; i < 100; i++)
{
a[i] = i;
}
boost::archive::text_oarchive oa(ss);
oa << boost::serialization::make_array(a.data(), a.size());
data = ss.str();
ss.str("");//将字符串流清空
struct timeval tv;
tv = {2,5000};
redisContext* c = redisConnectWithTimeout("127.0.0.1", 6379, tv);
if (c->err)
{
std::cout << "Connect to redisServer failed: " << c->errstr << std::endl;
redisFree(c);
return 0;
}
redisReply* r = (redisReply*)redisCommand(c, "set test %s",data.c_str());
if (NULL == r)
{
std::cout << "Execut command1 failed" << std::endl;
freeReplyObject(r);
redisFree(c);
return false;
}
if (!(r->type == REDIS_REPLY_STATUS && (strcmp(r->str, "OK") == 0 || strcmp(r->str, "ok") == 0)))
{
std::cout << "Failed to execute command: "<< endl;
freeReplyObject(r);
redisFree(c);
return false;
}
freeReplyObject(r);
redisReply* reply = (redisReply*)redisCommand(c, "get test");
if (NULL == r)
{
cout<<"get test failed!"<<endl;
}
ss << reply->str;
boost::archive::text_iarchive ia(ss);
ia >> boost::serialization::make_array(b.data(), b.size());
for (size_t i = 0; i < b.size(); i++)
{
cout << b[i] << " ";
}
freeReplyObject(reply);
redisFree(c);
getchar();
return 0;
}
运行结果:
redisServer中存储数据;