1.Windows下Redis的安装使用
Redis是一个key-value存储系统。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。本文中,作者分享了在Windows下进行安装和使用Redis的技巧。
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave。
前言
因为是初次使用,所以是在windows下进行安装和使用,下面整理一下:
安装Redis
下载:
http://www.2cto.com/soft/201403/45512.html
github的资源可以ZIP直接下载的(这个是给不知道的同学友情提示下)。
下载完成后 可以右键解压到 某个硬盘下 比如D:\Redis\redis-2.6。
在D:\Redis\redis-2.6\bin\release下 有两个zip包 一个32位一个64位。
根据自己windows的位数 解压到D:\Redis\redis-2.6根目录下。
2.启动Redis
?
进入redis目录后 开启服务 (注意加上redis.conf)
1. redis-server.exe redis.conf
这个窗口要保持开启 关闭时redis服务会自动关闭
redis会自动保存数据到硬盘 所以图中是我第二次开启时 多了一个 DB loaded from disk
3.测试使用
?
另外开启一个命令行窗口 进入redis目录下 (注意修改自己的ip)
1. redis-cli.exe -h 192.168.10.61 -p 6379
?
2. windows环境下通过c++使用redis
环境:VS2010
1. 新建一个Win32 ConsoleApplication工程
2. 将工程属性->C/C++->CodeGeneration->Runtime Library设置为Multi-threadedDebug(Debug版本)或Multi-threaded(Release版本)
3. 将hiredis.h文件放到工程目录下,将hiredis.lib文件放到Debug或Release目录下,总之让程序能找到hiredis.lib文件
程序如下:
#include"stdafx.h"
#include"hiredis.h"
#pragmacomment(lib, "hiredis.lib")
#pragmacomment(lib, "ws2_32.lib")
void doTest()
{
//初始化ws2_32库
WSADATA wsaData;
WSAStartup(MAKEWORD(2,1), &wsaData);
int timeout = 10000;
struct timeva l tv;
tv.tv_sec = timeout /1000;
tv.tv_usec = timeout *1000;
//以带有超时的方式链接Redis服务器,同时获取与Redis连接的上下文对象。
//该对象将用于其后所有与Redis操作的函数。
redisContext* c = redisConnect((char*)"127.0.0.1",6379);
if (c->err) {
redisFree(c);
return;
}
const char* command1 ="set stest1 value9";
redisReply* r =(redisReply*)redisCommand(c,command1);
//需要注意的是,如果返回的对象是NULL,则表示客户端和服务器之间出现严重错误,必须重新链接。
//这里只是举例说明,简便起见,后面的命令就不再做这样的判断了。
if (NULL == r) {
redisFree(c);
return;
}
//不同的Redis命令返回的数据类型不同,在获取之前需要先判断它的实际类型。
//至于各种命令的返回值信息,可以参考Redis的官方文档,或者查看该系列博客的前几篇
//有关Redis各种数据类型的博客。:)
//字符串类型的set命令的返回值的类型是REDIS_REPLY_STATUS,然后只有当返回信息是"OK"
//时,才表示该命令执行成功。后面的例子以此类推,就不再过多赘述了。
if (!(r->type == REDIS_REPLY_STATUS &&(strcmp(r->str,"OK")== 0 || strcmp(r->str, "ok") == 0))) {
printf("Failed to execute command[%s].\n",command1);
freeReplyObject(r);
redisFree(c);
return;
}
//由于后面重复使用该变量,所以需要提前释放,否则内存泄漏。
freeReplyObject(r);
printf("Succeed toexecute command[%s].\n",command1);
const char* command2 ="strlen stest1";
r = (redisReply*)redisCommand(c,command2);
if (r->type !=REDIS_REPLY_INTEGER) {
printf("Failed to execute command[%s].\n",command2);
freeReplyObject(r);
redisFree(c);
return;
}
int length =r->integer;
freeReplyObject(r);
printf("The lengthof 'stest1' is %d.\n",length);
printf("Succeed toexecute command[%s].\n",command2);
const char* command3 ="get stest1";
r =(redisReply*)redisCommand(c,command3);
if (r->type !=REDIS_REPLY_STRING) {
printf("Failed to execute command[%s].\n",command3);
freeReplyObjec