简介
Redis是一个高性能的key-value数据库,所支持的value类型包括string(字符串)、list(链表)、set(集合)、zset(sorted set,有序集合)和hash(哈希类型)等,数据操作具有原子性。
为了保证效率,数据都是缓存在内存中,此外Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。环境
Win7 64bit,VS2013,Reids-2.6。下载
Redis官网不支持Windows,但可以从 GitHub上下载Microsoft Open Tech group开发的Win64的版本。
测试过程中,最先采用 redis-3.0,编译lib库成功,但将lib链接到自己程序时编译失败,最后改用reids-2.6。
编译
1)进入redis-2.6目录\msvs,用vs2013打开RedisServer.sln。
2)工程列表显示有8个工程。3)依次编译各工程,最终生成2个lib文件和5个exe文件:
注册Windows服务
1)将RedisServer.sln编译生成的5个exe文件拷贝至Redis根目录。
2)启动cmd.exe,切换至Redis根目录后,执行命令:
redis-server.exe –service-install redis.conf –loglevel verbose sc start Redis注:
命令1:创建Windows服务。
命令2:启动Redis服务。
若需删除Windows服务,则以管理员身份运行cmd.exe后,执行命令“sc delete 服务名称”即可。可视化管理工具Redis Desktop Manager
Redis Desktop Manager下载地址安装后,启动Redis Desktop Manager,设置数据库连接选项:
注:
Auth表示登录密码,对应于配置文件redis.conf中选项requirepass的值,去掉requirepass前的“#”并指定值,即可设置登录密码(默认不需要登录密码)。Redis数据库结构:
Redis命令
7.1. 字符串(string)
语法:redis 127.0.0.1:6379> SET KEY_NAME VALUE
简介:设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。
实例:
通过SET命令设置key对应的value,并通过GET命令获取key对应的value。redis 127.0.0.1:6379> SET key "value" OK redis 127.0.0.1:6379> GET key "value" # 对已存在的键进行设置 redis 127.0.0.1:6379> SET key "new-value" OK redis 127.0.0.1:6379> GET key "new-value"
7.2. 哈希(hash)
语法:redis 127.0.0.1:6379> HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN
简介:用于同时将多个 field-value (字段-值)对设置到哈希表中。
注:
此命令会覆盖哈希表中已存在的字段。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。即:
若key不存在,则新建key;若key存在且field不存在,则原key中增加value;若key存在且field存在,则修改原key中field对应的value。实例:
通过HMSET命令向名为myhash的哈希表中插入两个元素,并通过HGET获取指定field对应的value。redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World" OK redis 127.0.0.1:6379> HGET myhash field1 "Hello" redis 127.0.0.1:6379> HGET myhash field2 "World"
7.3. 列表(list)
语法:redis 127.0.0.1:6379> LPUSH KEY_NAME VALUE1.. VALUEN
简介:一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
实例:
通过LPUSH命令向名为list1的列表插入三个元素,并通过LRANGE返回列表指定索引区间内元素。127.0.0.1:6379> LPUSH list1 "foo" (integer) 1 127.0.0.1:6379> LPUSH list1 "bar" (integer) 2 127.0.0.1:6379> LRANGE list1 0 -1 1) "bar" 2) "foo"
7.4. 无序集合(set)
语法:redis 127.0.0.1:6379> SADD KEY_NAME VALUE1..VALUEN
简介:用于将一个或多个成员元素加入到集合中。(成员元素必须唯一)
实例:
通过SADD命令向名为runoobkey的集合插入三个元素,并通过SMENBERS命令返回集合内元素。redis 127.0.0.1:6379> SADD runoobkey redis (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mongodb (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mysql (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mysql (integer) 0 redis 127.0.0.1:6379> SMEMBERS runoobkey 1) "mysql" 2) "mongodb" 3) "redis"
7.5. 有序集合(sorted set)
语法:redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
简介:将一个或多个成员元素及其分数值加入到有序集当中。每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
实例:
通过ZADD命令向名为sunoobkey的集合中插入四个元素,并通过ZRANGE命令返回指定索引区间内元素。redis 127.0.0.1:6379> ZADD runoobkey 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD runoobkey 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
7.6. 用户验证
Redis未实现访问控制功能,但它提供了一个轻量级的认证方式。语法:
redis 127.0.0.1:6379> redis 127.0.0.1:6379> config set requirepass password
简介:设置Redis访问密码。
实例:
通过config set requirepass命令设置Redis访问密码后,必须通过auth命令验证密码后,才可对Redis进行操作。redis 127.0.0.1:6379> SET key "value" ok redis 127.0.0.1:6379> config set requirepass test123 ok redis 127.0.0.1:6379> SET key "value2" (error) NOAUTH Authentication required. redis 127.0.0.1:6379> auth test123 ok redis 127.0.0.1:6379> SET key "value2" ok
Redis在C++中应用
8.1设置工程属性
1)将hiredis.lib和redis-2.6\src、redis-2.6\deps\hiredis路径添加至新工程。
2)工程预处理器中增加:WIN32_LEAN_AND_MEAN _LIB _WIN32 _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE _CRT_SECURE_NO_DEPRECATE
8.2. VS2013测试
#include "hiRedis\hiredis.h"
#define NO_QFORKIMPL///这一行必须加上 且必须放在 #include "Redis\win32fixes.h" 之前才能正常使用
#include "Redis\win32fixes.h"
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 1), &wsaData);
///1、连接Redis数据库
redisReply *reply;
struct timeval timeout = {1, 500000}; /// 1.5 seconds
QSharedPointer<redisContext> pRedisContext = QSharedPointer<redisContext>(redisConnectWithTimeout((char*)"127.0.0.1", 6379, timeout));
if (pRedisContext.isNull())
{
strLastError = QString("Redis数据库连接失败");
return false;
}
if (pRedisContext->err)
{
strLastError = QString("Redis数据库连接失败,错误信息:%1").arg(pRedisContext->errstr);
return false;
}
///2、设置key-value
redisReply *pRedisReply = (redisReply *)redisCommand(pRedisContext.data(), "SET %s %s", "DataBase","Redis");
if (pRedisReply == NULL || QString::compare("ok", pRedisReply->str, Qt::CaseInsensitive) != 0)
{
strLastError = QString("Redis数据库SET操作失败");
return false;
}
///3、获取key-value
pRedisReply = (redisReply *)redisCommand(pRedisContext.data(), "GET %s", strKey.toStdString().data());
if (pRedisReply == NULL)
{
strLastError = QString("Redis数据库GET操作失败");
return false;
}
return EXIT_SUCCESS;
}