Redis
2015年4月22日
1 目标:服务器端高速缓存。
客户端向服务器发起大量请求时,使用key-value类型的高速缓存,能够快速响应请求。
2 原理:key-value数据库服务器。
高速key-value字典服务器。
3 方法:Redis(Remote Dictionary Server)。
默认9个及以下修改时,15分钟持久化一次。
参考:http://www.w3cschool.cc/redis/redis-tutorial.html
http://www.cnblogs.com/stephen-liu74/archive/2012/03/12/2348935.html
3.1 Redis编译
Redis默认只支持Linux,在Windows上需要使用MSOpenTech小组开发的MSVS相关源程序。
Redis源码(Linux):http://redis.io/
最新Redis for Windowhttps://github.com/MSOpenTech/redis/tree/2.8。
3.2 在VS下编译(VS2013)
打开Redis下的MSVS目录下的.slu工程。
编译。
完成后在相应的debug/release目录下有输出文件。
3.3 Redis服务器:Redis-server.exe
Redis-server.exe是服务器程序。下载或编译后,新建redis.conf文件,用于配置服务器参数。
打开方式为:
Redis-server.exe redis.conf
配置文件:key value(注释)。参考:http://blog.csdn.net/java2king/article/details/5754476
服务器打开后,需要一直运行。
3.4 Redis客户端:Redis-cli.exe
3.4.1连接
redis-cli.exe:redis-cli.exe–h ip –p port
Ip为服务器所在IP,port为redis服务的端口号,从服务程序可以看到为6379(默认值)。
3.4.2数据
写入数据:set key value
获取数据:get key
删除数据:del key
详细命令参见:http://www.w3cschool.cc/redis/redis-keys.html
示例:
写入配置:config set key value
读出配置:config get key,当key为*时读出所有配置。
数据类型:
String:默认方式,最多512M,可以转换为其它数据类型。
哈希Hash:hmset key field1value1[f v];hgetall key
列表List:lpush name item;lrange name startposendpos
无序唯一值集合Set:sadd name item;smembers name
有序集合zset:zadd namescore item;zrangebyscore name
3.4.3消息分发与订阅
分发:publis channel message
订阅:subscribe channel
3.4.4事务
MULTI开始,中间所有操作,exec进行原子执行
3.4.5脚本:使用lua
3.4.6服务器信息:info
3.4.7数据备份与恢复:save,dump.rdb
备份:save,将在服务目录生成dump.rdb。
恢复:将dump.rdb放到服务目录,重启服务自动恢复。
3.4.8安全:密码设置
查看当前密码:config get requirepass
设置密码:config set requirepass “psw”,密码设置后所有没有输入密码的客户端需要重新验证。
验证密码:Auth psw
3.5 Redis性能测试:Redis-benchmark.exe
-t 命令,命令…
-n 请求数。
3.6 Redis开发(C++)
Redis官方不支持在Windows下开发,使用MSOpenTech的源码,可以编译为静态库。
编译静态库:需要编译hiredis和win32_interop两个静态库。
头文件:将hiredis和win32_interop加入到当前包含目录。
连接服务器:redisConnect(ip,port),返回redisContext *,是后续命令的上下文对象。
输入命令:redisComment(context,cmd,value),cmd是带参数的命令,value是其中的参数值。返回void *值,需要强制转化为redisReply解析结果。
返回结果:redisReply可以解析为各种格式。
参考:http://www.cnblogs.com/raker/p/4368741.html
http://www.kazaff.me/2013/02/21/hiredis%E5%85%A5%E9%97%A8/
示例:
#include "stdafx.h"
#include <iostream>
#include <hiredis.h>
#pragma comment(lib,"hiredis.lib")
#pragma comment(lib,"Win32_Interop.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//connect
redisContext *pContext = redisConnect("127.0.0.1", 6379);
if (NULL == pContext || pContext->err){
cout << pContext->errstr;
}
cout << "connect to redis server successed."<<endl;
//auth
redisReply *pAuth = (redisReply *)redisCommand(pContext, "auth %s", "xxyyuu");
cout << "auth=" << pAuth->str << endl;
freeReplyObject(pAuth);
//test
redisReply *pReply = (redisReply *)redisCommand(pContext, "ping");
cout << "reply=" << pReply->str<<endl;
freeReplyObject(pReply);
getchar();
return 0;
}
结果:
connect to redis server successed.
auth=OK
reply=PONG