工作中需要使用C++做一个服务该服务要访问REDIS缓存系统,之前是用C#做的有现成的类库可用。转到C++就没这么方便了所以决定上网搜搜资料。
想要安装该客户端系统必须要装boost库,此库安装步骤如下:
1. 上官方网站下载到最新版本1.49版,解压后进入目录,简单安装:
./bootstrap.sh
sudo ./b2 install
2. 安装的时候可能会出现下面错误,处理办法如下:
过程中会提示: patchlevel.h:没有那个文件或目录 可以这样安装:
sudo apt-get install python-dev
过程中又提示: bzlib.h:没有那个文件或目录 可以这样安装:
sudo apt-get install libbz2-dev
安装比较耗时我用了大概半个钟头以上时间。
总算把boots库安装完了也没出现啥错误下面开始安装redis客户端了:
1. 首先找到C++连接REDIS的客户端叫mrpi-redis-cplusplus-client-14e3829 注意后面一串数字,因为早些时候的客户端只能连接到REDIS的1.0大版本2.0版本是无法连接的。
我找到的这个版本可以连接到2.0版本。在mrpi-redis-cplusplus-client下make 发现有错误。提示说 找不到lboost_thread-mt 这个玩意。
找了好长时间资料最后有一老外说要修改Makefile文件,按照他得说法用VIM打开文件吧“lboost_thread-mt” 改成 “lboost_thread”保存。
2. 修改相关文件中服务器连接地址和端口(貌似有两三个地方),重新make 然后./test_client运行正常。
3. 虽然./test_client 运行没问题,但是对我们来说需要改造一下,去掉不用的并面向对象化。 由于我们项目只需操作队列,也就是是list 所以根据提供的test我写了一个类
#include <iostream>
#include <boost/date_time.hpp>
class RedisHelper
{
public:
typedef redis::base_client<redis::default_hasher>::string_type ResStr;
static void Push(string key,string val)
{
redis::client *c = RedisHelper::GetClient();
try
{
c->rpush(key, val);
delete c;
}
catch (redis::redis_error & e)
{
delete c;
}
};
static ResStr Pop(string key)
{
redis::client *c = RedisHelper::GetClient();
ResStr res;
try
{
res = c->lpop(key);
delete c;
}
catch (redis::redis_error & e)
{
delete c;
}
return res == "**nonexistent-key**" ? "" : res;
};
private:
static redis::client* GetClient()
{
const char* c_host = getenv("REDIS_HOST");
string host = "192.168.45.144";
if(c_host)
host = c_host;
return new redis::client(host);
//redis::client::string_vector keys;
//redis::client::int_type count
};
};
头文件代码也总结成了一个redisclient.h,由于内容较大故不贴出代码了,有需要的可以找我要。
最后写个测试代码测试一把:
int main()
{
RedisHelper rs;
//rs.Push("key1","val1");
cout << rs.Pop("noke") << endl;
cout << (rs.Pop("key1") == "***nonexistent-key**") << endl;
return 1;
};
编译的时候别忘了链接库
g++ king.cc -o king -lpthread -lboost_thread
运行通过!