Sword redis存取二進制數據


#include "hiredis/hiredis.h"   /* redis頭文件 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <string>

//初始化
int init(const char *ip,uint16_t port)
{
    redisContext *_context;

    //創建redis鏈接
    _context = redisConnect(ip, port);
    if (NULL == _context)
    {
        return -1;
    }

    return 0;
}

//二進制數據set操作
/********************************************************
    Func Name: getInstance
Date Created: 2018-10-12
    Description: 創建實例對象
        Input:@key: key值
        @value: value值
        @vlen: value數據長度
        Output:
        Return: error code
        Caution:
*********************************************************/
int set(redisContext *_context, const char *key, uint8_t *value, uint32_t vlen)
{
    /*
      為什么argv數組長度是5
      set    key     value   ex     time
      元素1  元素2   元素3   元素4  元素5
    */
    const char * argv[5] = { 0 };    //用來存儲所有的數據
    size_t argvlen[5] = { 0 };       //用來存儲數據的長度
    redisReply *rep = NULL;
    std::string strRes;

    if (NULL == key || NULL == value || 0 == vlen)
    {
        return -1;
    }

    argv[0] = "set";
    argvlen[0] = strlen("set");

    argv[1] = key;
    argvlen[1] = strlen(key);

    argv[2] = (char *)value;
    argvlen[2] = vlen;

    //設置超時時間

    argv[3] = "ex";
    argvlen[3] = strlen("ex");

    argv[4] = "3600";
    argvlen[4] = strlen("3600");

    rep = (redisReply *)redisCommandArgv(_context, 5, argv, argvlen);
    if (NULL == rep)
    {
        return -1;
    }

    if (REDIS_REPLY_STATUS == rep->type)
    {
        strRes = rep->str;
    }

    freeReplyObject(rep);
    rep = NULL;

    return ("OK" == strRes ? 0 : -1);

}

/********************************************************
    Func Name: get
Date Created: 2018-12-11
    Description: get
        Input:
        Output:
        Return: error code
        Caution:
*********************************************************/
int get(redisContext *_context, const char *key, uint8_t *&value, uint32_t &vlen)
{
    redisReply *rep = NULL;
    char *cmd = NULL;

    if (NULL == key)
    {
        return -1;
    }

    cmd = (char *)malloc(strlen(key) + strlen("get") + 10);
    if (NULL == cmd)
    {
        return -1;
    }
    memset(cmd, 0, strlen(key) + strlen("get") + 10);
    sprintf(cmd, "get %s", key);

    rep = (redisReply *)redisCommand(_context, cmd);
    if (NULL == rep)
    {
        return -1;
    }

    vlen = rep->len;
    if (rep->len <= 0)
    {
        return -1;
    }
    value = (uint8_t *)malloc(vlen);
    if (NULL == value)
    {
        return -1;
    }
    memset(value, 0, vlen);
    memcpy(value, rep->str, rep->len);

    freeReplyObject(rep);
    rep = NULL;

    return 0;
}
問題:客戶端無法登錄Redis服務器報錯,解除保護模式

解決方案
1、修改redis服務器的配置文件
vi redis.conf  
 
注釋以下綁定的主機地址
# bind 127.0.0.1
 
2、修改redis服務器的參數配置
 
修改redis的守護進程為no ,不啟用
127.0.0.1:6379> config set daemonize "no"
OK
 
修改redis的保護模式為no,不啟用
127.0.0.1:6379> config set protected-mode "no"

注意:修改redis服務器的參數配置,只能通過redis-cli客戶端修改(直接修改redis.conf沒有效果),
如果redis服務器重啟了,那么修改將會失效

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM