使用hiredis存储数组元素

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中存储数据;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在QT中使用Hiredis异步连接并设置时间,可以按照以下步骤进行: 1. 安装Hiredis 在QT项目中使用Hiredis,需要先安装Hiredis库。可以通过以下命令在Ubuntu中安装Hiredis: ``` sudo apt-get install libhiredis-dev ``` 2. 设置Hiredis异步连接 在QT项目中使用Hiredis异步连接,需要使用event loop库来处理异步事件。可以使用libevent或者Qt的事件循环。这里使用Qt的事件循环来处理异步事件。 首先,需要使用Hiredis提供的`redisAsyncConnect()`函数来建立异步连接。例如: ``` redisAsyncContext *redis = redisAsyncConnect("127.0.0.1", 6379); ``` 然后,需要设置连接回调函数和命令回调函数。连接回调函数在连接成功或失败时调用,命令回调函数在命令执行成功或失败时调用。例如: ``` redisAsyncSetConnectCallback(redis, connectCallback); redisAsyncSetDisconnectCallback(redis, disconnectCallback); redisAsyncCommand(redis, commandCallback, NULL, "SET key value"); ``` 这里的`connectCallback`、`disconnectCallback`和`commandCallback`都是回调函数,需要根据具体情况实现。 3. 设置Hiredis异步事件处理 使用Qt的事件循环处理Hiredis异步事件,可以使用`QSocketNotifier`类来监控异步连接的文件描述符,使用`QTimer`类来定时处理异步事件。例如: ``` QSocketNotifier *notifier = new QSocketNotifier(redis->c.fd, QSocketNotifier::Read); connect(notifier, SIGNAL(activated(int)), this, SLOT(redisEventLoop())); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(redisEventLoop())); timer->start(1); ``` 这里的`redisEventLoop()`是处理异步事件的槽函数,需要根据具体情况实现。 4. 设置Hiredis异步连接超时时间 可以使用`redisAsyncSetTimeout()`函数设置异步连接超时时间。例如: ``` struct timeval tv = {1, 0}; redisAsyncSetTimeout(redis, tv); ``` 这里的超时时间为1秒。 总的来说,要在QT中使用Hiredis异步连接并设置时间,需要使用Hiredis提供的异步连接函数和事件处理函数,同时结合Qt的事件循环来处理异步事件,并使用`redisAsyncSetTimeout()`函数设置连接超时时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值