一、Redis简介:

Redis为非关系型数据库,Redis是一个Key-Value存储系统。它支持存储的value类型有:string(字符串),list(链表), set(无序集合),zset(sorted set有序集合)和hash,Redis支持各种不同方式的排序。数据都是缓存在内存中的,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并实现了master-slave(主从)同步。

二、Redis安装和使用:

  Redis下载地址,我下载的为最新版本:

wget http://download.redis.io/releases/redis-...tar.gz

解压安装:

$ tar xzf redis-...tar.gz
$ cd redis-..
$ make

make完后 redis-3.2.8目录下会出现redis-server和redis-cli
下面在src目录下启动redis服务.

$./redis-server
注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动.
 
$ ./redis-server redis.conf

redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了.

下面为官方提供的案例:
服务器启动:
src/redis-server redis.conf

客户端读写:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

redis.conf 为redis配置文件,有很多参数供用户修改,这里仅仅

说明几个参数,其他的读者自行搜索。

port: 为redis启动的端口号,当需要启动多个redis服务器时修改该参数,

可以启动多个服务。

bind :绑定ip,设置后只接受自该ip的请求

databases :设置数据库的个数,默认使用的数据库为0,redis有16个数据库,

修改参数可写入不同的数据库。

requirepass :设置登录时需要使用的密码。

下面修改

requirepass  为 zjml123456&&REDIS

那么重启redis-server,放在后台运行。效果就是这样

然后启动客户端使用密码登录并且查询数据:

使用密码命令为:auth 密码

设置key和value的命令为: set key value

取出key对应的value 为: get key

三、使用C++访问redis:

使用redis接口之前需要将hireids.h 和libhiredis.a放到项目目录里,

这两个文件在redis解压目录redis-3.2.8/deps/下

我这里写了一个demo,所以都放在demo的文件夹下了。

下面介绍redis提供的供C++访问的接口

主要包括如下四个方法

1. redisContext* redisConnect(const char *ip, int port)

该函数用来连接redis数据库, 两个参数分别是redis数据库的ip和端口,端口号一般为6379。

2. void *redisCommand(redisContext *c, const char *format...)

该函数用于执行redis数据库中的命令,第一个参数为连接数据库返回的redisContext,剩下的参数

为变参,如同C语言中的prinf()函数。

此函数的返回值为void*,但是一般会强制转换为redisReply类型,以便做进一步的处理。

根据redisReply中的type变量类型判断命令执行情况

  • REDIS_REPLY_STATUS:

    • 返回执行结果为状态的命令。比如set命令的返回值的类型是REDIS_REPLY_STATUS,然后只有当返回信息是"OK"时,才表示该命令执行成功。

    • 可以通过reply->str得到文字信息,通过reply->len得到信息长度。

  • REDIS_REPLY_ERROR:

    • 返回错误。错误信息可以通过reply->str得到文字信息,通过reply->len得到信息长度。

  • REDIS_REPLY_INTEGER:

    • 返回整型标识。可以通过reply->integer变量得到类型为long long的值。

  • REDIS_REPLY_NIL:

    • 返回nil对象,说明不存在要访问的数据。

  • REDIS_REPLY_STRING:

    • 返回字符串标识。可以通过reply->str得到具体值,通过reply->len得到信息长度。

  • REDIS_REPLY_ARRAY:

    • 返回数据集标识。数据集中元素的数目可以通过reply->elements获得,每个元素是个redisReply对象,

    • 元素值可以通过reply->element[..index..].*形式获得,用在获取多个数据结果的操作。

3. void freeReplyObject(void *reply)

释放redisCommand执行后返回的的redisReply所占用的内存。

4. void redisFree(redisContext *c)

释放redisConnect()所产生的连接。

下面是我封装的一个C++访问redis的类

RedisManager.h

class RedisManager
{
public: RedisManager();
virtual ~RedisManager();
//初始化函数
bool initial();
//释放函数
void release();
//封装的set接口
void set(std::string key, std::string value);
//封装的get接口
std::string get(std::string key); private: //连接的缓存指针
redisContext* m_pConnect;
//请求处理结果指针
redisReply* m_pReply;
};

RedisManager.cpp

分别介绍几个接口:

构造函数和析构函数没写代码,下面是初始化函数:

初始化函数:

bool RedisManager::initial()
{
//redis服务器ip
const char* redisIp = "192.168.1.40";
//redis服务器端口
int redisPort = ;
//连接redis服务器
m_pConnect = redisConnect(redisIp, redisPort);
m_pReply = NULL;
if(!m_pConnect)
{
return false;
}
if (m_pConnect != NULL && m_pConnect->err) {
cout << " redis connect failed!!!!" << endl;
return false;
}
//根据密码登录
m_pReply =(redisReply*) redisCommand(m_pConnect, "AUTH %s", mypass.c_str());
if(!m_pReply)
{
cout << "redis exe failed!!"<<endl;
return false;
} if( !(m_pReply->type == REDIS_REPLY_STATUS && strcasecmp(m_pReply->str,"OK")==))
{
cout << " redis auth failed!!!!" << endl;
freeReplyObject(m_pReply );
m_pReply = NULL;
return false;
} freeReplyObject(this->m_pReply );
m_pReply = NULL; cout << " redis auth success!!!!" << endl;
return true;
}

释放函数:

void RedisManager::release()
{
//释放连接
freeReplyObject(m_pConnect);
m_pConnect = NULL;
m_pReply = NULL;
}

set函数:

void RedisManager::set(std::string key, std::string value)
{
//设置key和value关系,插入redis
redisReply* r =(redisReply*)redisCommand(this->m_pConnect, "SET %s %s", key.c_str(), value.c_str());
if(!r)
{
cout << "set redis faliled" << endl;
return;
} //执行失败
if( !(r->type == REDIS_REPLY_STATUS && strcasecmp(r->str,"OK")==))
{
cout << "set redis faliled" << endl;
freeReplyObject(r );
return;
} cout << "set redis success"<<endl;
freeReplyObject(r );
}

get函数:

std::string RedisManager::get(std::string key)
{
//根据key获取value
m_pReply = (redisReply*)redisCommand(this->m_pConnect, "GET %s", key.c_str());
if(!m_pReply)
{
cout << "get value failed" << endl;
return "";
}
//get成功返回结果为 REDIS_REPLY_STRING
if( m_pReply->type != REDIS_REPLY_STRING )
{
cout << "get redis faliled" << endl;
freeReplyObject(m_pReply );
m_pReply = NULL;
return "";
}
cout << "get redis success"<<endl;
std::string valuestr = m_pReply->str;
freeReplyObject(m_pReply );
m_pReply = NULL; return valuestr ;
}

main函数:

int main()
{
RedisManager * redisManager = new RedisManager();
if(redisManager)
{
redisManager->initial(); edisManager->set("test","nice to meet u!"); std::string valueStr = redisManager->get("1sdfd"); cout << valueStr << endl; redisManager->release();
delete redisManager;
} }

源码下载地址:

  http://download.csdn.net/detail/secondtonone1/9826761

我的微信公众号:

最新文章

  1. JQuery:JQuery设置HTML
  2. Build Settings
  3. ACM——A + B Problem (4)
  4. Linux下如何发布Qt程序
  5. [Hapi.js] Logging with good and good-console
  6. UI产品设计流程中的14个要点
  7. 前端资讯周报 3.6 - 3.12: 对学习Javascript最有帮助的三本书,以及HTML标题的迷思
  8. 浅谈jQuery Pagination Ajax 分页插件的使用
  9. 紧急求助!配置SMTP插件出错,SMTP connect() failed
  10. IDEA、Matlab 注释
  11. 深入理解之css中的border属性
  12. 14-03 java BigInteger类,BigDecimal类,Date类,DateFormat类,Calendar类
  13. 困惑2----(已经OK)
  14. SharePoint 2019 离线安装准备工具
  15. 【笔记】CSS选择器整理(IE低版本支持性测试)
  16. iOS6新特征:UICollectionView介绍-非常棒 -转
  17. C语言模拟ATM机界面
  18. python-social-auth with Django: ImportError: No module named &#39;social_django&#39; 解决方法
  19. Unreal Enginer4特性介绍
  20. 快速理解python2中的编码问题

热门文章

  1. 技本功丨请带上纸笔刷着看:解读MySQL执行计划的type列和extra列
  2. pspo过程文档
  3. mininet实验 脚本实现控制交换机行为
  4. Rsyslog初步学习
  5. 01_Java基础_第1天(Java概述、环境变量、注释、关键字、标识符、常量)_讲义
  6. Throwable、Error、Exception、RuntimeException 区别 联系
  7. IBM存储降级告警等一些服务器问题/dd/ethtool
  8. Q3 大型科技公司季报
  9. 【转】mysql force Index 强制索引
  10. CentOS 6.5安装配置LAMP服务器(Apache+PHP5+MySQL)