ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

c++ centos redis 通讯demo 封装

2021-05-20 12:03:24  阅读:188  来源: 互联网

标签:REDIS MyRedis centos demo redis result key REPLY


c++ redis 通讯,可以使用hiredis api开发,

先安装 redis  和 hiredis

# 安装redis
# 需要安装Remi的软件源,# 另一种方案  https://blog.csdn.net/WeiHao0240/article/details/116455608?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum --enablerepo=remi install redis -y
rpm -ql redis
rpm -qa |grep redis
redis-server -v

# c++ 使用redis ,(git,版本大于2,使用默认源下载的git无法正常clone)需要hiredis  编译时加上 -lhiredis eg:g++  main.cpp MyDB.cpp -o main -lhiredis  `mysql_config --cflags --libs` 
# 源码安装 git 参考 https://www.cnblogs.com/todarcy/p/11050337.html
yum install -y http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm
yum install git -y
git --version
git clone https://github.com/redis/hiredis
cd hiredis
make
sudo make install        # 复制生成的库到/usr/local/lib目录下
sudo ldconfig /usr/local/lib

 

 

记录下常用的redis指令

# redis 常用命令(版本高一点,可以一次插入多个值)
# service redis start            # 启动redis
# service redis stop             # 停止redis
# service redis status             # 查看redis运行状态
# ps -ef | grep redis            # 查看redis进程

# chkconfig redis on            # 设置redis为开机自动启动
# vi /etc/redis.conf            # 修改redis默认端口和密码        
# 修改第80行 901行 参考 https://www.cnblogs.com/chengxs/p/9833911.html    https://blog.csdn.net/WeiHao0240/article/details/116455608?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
# redis-server /etc/redis.conf &     # 使用配置文件启动redis
# redis-cli -h 127.0.0.1 -p 6379    # 使用端口登录,输入redis密码 redis_pwd       # redis-cli                    # 进入本机redis
# auth redis_pwd

# 远程连接参考 https://www.jianshu.com/p/6895384d2b9e
# 常用命令参考 https://www.cnblogs.com/cxxjohnson/p/9072383.html
# Redis Desktop Manager 下载  https://pan.baidu.com/s/1Jvr9MbgFn4UJh4M1AMo3gA 提取码:3i9b

# key
#     keys * 获取所有的key
#     select 0 选择第一个库
#     move myString 1 将当前的数据库key移动到某个数据库,目标库有,则不能移动
#     flush db      清除指定库
#     randomkey     随机key
#     type key      类型   
#     set key1 value1 设置key
#     get key1    获取key
#     mset key1 value1 key2 value2 key3 value3
#     mget key1 key2 key3
#     del key1   删除key
#     exists key      判断是否存在key
#     expire key 10   10过期
#     pexpire key 1000 毫秒
#     persist key     删除过期时间
    
# hash
#     hset myhash name cxx
#     hget myhash name
#     hmset myhash name cxx age 25 note "i am notes"
#     hmget myhash name age note   
#     hgetall myhash               获取所有的
#     hexists myhash name          是否存在
#     hsetnx myhash score 100      设置不存在的
#     hincrby myhash id 1          递增
#     hdel myhash name             删除
#     hkeys myhash                 只取key
#     hvals myhash                 只取value
#     hlen myhash                  长度

# set
#     sadd myset redis 
#     smembers myset       数据集合
#     srem myset set1         删除
#     sismember myset set1 判断元素是否在集合中
#     scard key_name       个数
#     sdiff | sinter | sunion 操作:集合间运算:差集 | 交集 | 并集
#     srandmember          随机获取集合中的元素
#     spop                 从集合中弹出一个元素

    
# Redis本身存储就是一个hash表,     Key只有String类型 Value包括String ,Set,List,Hash,Zset五中类型
# 对于用户设备 对应关系来说,  key  使用 username 和 deviceid  (都属于唯一值)    ,value 存放采用 set 类型
# 对于设备基本信息 key deviceid      ,value使用 Hash 类型  ,ip:port(frontTcp)  header  key  protocolVersion  keyVersion

# c++操作 redis 使用的是 hiredis
# 返回值是一个类型,判断type,决定读取哪一个数据
# typedef struct redisReply {
#     int type; /* 返回值类型 */
#     long long integer; /* 当返回类型为 REDIS_REPLY_INTEGER 时 */
#     size_t len; /* 返回的字符串长度 */
#     char *str; /* 当返回值类型为 REDIS_REPLY_ERROR 和 REDIS_REPLY_STRING */
#     size_t elements; /* 返回的数组长度 */
#     struct redisReply **element; /* 当返回值类型为 REDIS_REPLY_ARRAY */
# } redisReply;
# type 有以下几种类型:
#   REDIS_REPLY_STRING  : 1 
#   REDIS_REPLY_ARRAY : 2
#   REDIS_REPLY_INTEGER :3 
#   REDIS_REPLY_NIL  : 4
#   REDIS_REPLY_STATUS : 5
#   REDIS_REPLY_ERROR : 6

 

 

源文件

MyRedis.h

/*************************************************************************
> File Name: MyRedis.h
> Author:Ashuai 
> Mail:2829735186@qq.com 
> Created Time: 2021年05月20日 星期三 11时11分11秒
************************************************************************/

#ifndef _MYREDIS_H
#define _MYREDIS_H

#include <stdio.h> 
#include <stdlib.h> 
#include <stddef.h> 
#include <stdarg.h> 
#include <string.h> 
#include <assert.h> 
#include <hiredis/hiredis.h> 

using namespace std;

class MyRedis
{
    public:
        MyRedis();
        ~MyRedis();
        bool initRedis(string host="127.0.0.1",int port=6379,string passwd=""); //连接mysql
        bool exeSQL(string sql);   //执行sql语句
        bool freeResult();      //释放查询结果内存
        void showResult(redisReply *result);      //展示结果
    public:
        redisReply *result;      //指向查询结果的指针

    private:
        redisContext *conn;           //连接redis句柄指针
        
};


#endif


// //测试 demo  main.cpp  编译     g++  main.cpp MyRedis.cpp -o main -lhiredis     
// #include<iostream>
// #include"MyRedis.h"
// using namespace std;
// int main()
// {
//     MyRedis redis;
//     bool init = redis.initRedis("127.0.0.1",6379,"authPassword");
//     cout<<endl;
//     // if(init==false) redis.exeSQL("auth authPassword");
//     cout<<"command:"<<"hget 0000000000000102 ip"<<endl;
//     if(redis.exeSQL("hget 0000000000000102 ip") && redis.result ){
//         redis.showResult(redis.result);
//     }
//     redis.freeResult();cout<<endl;

//     cout<<"command:"<<"hgetall 0000000000000101"<<endl;
//     if(redis.exeSQL("hgetall 0000000000000101") && redis.result ){
//         redis.showResult(redis.result);
//     }
//     redis.freeResult();cout<<endl;

//     cout<<"command:"<<"keys *"<<endl;
//     if(redis.exeSQL("keys *") && redis.result ){
//         redis.showResult(redis.result);
//     }
//     redis.freeResult();

//     cout<<endl<<endl<<endl;
//     return 0;
// }

 

MyRedis.cpp

 

/*************************************************************************
> File Name: MyRedis.cpp
> Author:Ashuai 
> Mail:2829735186@qq.com 
> Created Time: 2021年05月20日 星期三 11时11分11秒
************************************************************************/

#include<iostream>
#include<string>
#include "MyRedis.h"

using namespace std;

MyRedis::MyRedis(){ }

MyRedis::~MyRedis()
{
    if (result) freeReplyObject(result);
    if(conn!=NULL)  //关闭连接
    {
        redisFree(conn); 
    }
}


bool MyRedis::initRedis(string host,int port,string passwd)
{
    conn = redisConnect(host.c_str(), port); 
    if ( conn->err) 
    { 
        redisFree(conn); 
        printf("Connect to redisServer faile\n"); 
        exit(1);   
    } 
    
    if(sizeof(passwd)>0)
    {
        string auth("auth ");
        auth.append(passwd);
        result = (redisReply*)redisCommand(conn, auth.c_str());   //auth 执行成功后返回 ok
        if( NULL == result) 
        { 
            printf("Execut auth failure\n");  
            return false; 
        }
        if( !(result->type == REDIS_REPLY_STATUS && strcasecmp(result->str,"OK")==0)) 
        { 
            printf("Execut auth failure\n");  
            return false; 
        }
        printf("redisServer auth Success\n");  
        freeReplyObject(result);
    }
    printf("Connect to redisServer Success\n");  
    return true;  
}

bool MyRedis::exeSQL(string sql)
{
    result = (redisReply*)redisCommand(conn, sql.c_str()); 
       
    if( NULL == result) 
    { 
        printf("Execut command failure\n");  
        return false; 
    }
    if(result->type == REDIS_REPLY_ERROR) 
    { 
        printf("Execut REDIS_REPLY_ERROR \n");  
        freeResult();
        return false; 
    }
    return true;
}

// 释放结果集的内存
bool MyRedis::freeResult(){
    if (result) {
        freeReplyObject(result);
        result = NULL;
    }
    return true;
}

void MyRedis::showResult(redisReply *result){


    switch(result->type){
        case REDIS_REPLY_STRING:{
            cout<<"REDIS_REPLY_STRING :"<<result->str << endl;
            break;
        }
        case REDIS_REPLY_ARRAY:{
            //此处 不排除套娃现象
            // struct redisReply **v = result->element;
            for(int i=0;i<result->elements;i++)
            {
                showResult(result->element[i]);
            }
            break;
        }
        case REDIS_REPLY_INTEGER:{
            cout<<"REDIS_REPLY_INTEGER :"<<result->integer<< endl;
            break;
        }
        case REDIS_REPLY_NIL:{
            cout<<"REDIS_REPLY_NIL :"<<result->str<< endl;
            break;
        }
        case REDIS_REPLY_STATUS:{
            cout<<"REDIS_REPLY_STATUS :"<<result->str<<endl;
            break;
        }
        case REDIS_REPLY_ERROR:{
            cout<<"REDIS_REPLY_ERROR :"<<result->str<< endl;
            break;
        }
        default:break;
    }
}

 

 

 

 

 

//

标签:REDIS,MyRedis,centos,demo,redis,result,key,REPLY
来源: https://www.cnblogs.com/RYSBlog/p/14789234.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有