ITPub博客

首页 > 应用开发 > > hiredis存入的问题

hiredis存入的问题

作者:古月雪 时间:2019-08-19 17:33:47 0 删除 编辑

用一个循环一千二百万次的for循环把一个qlist加到足够长,这时候可以正常的序列化后存入到redis中(string和list类型都可以存,其他的没试),但是把循环次数加到一千五百万的时候程序就崩溃了,不知道是什么原因?redis不是内存不限制就可以无限存入吗,为什么什么这个程序会出错呢

源码

#ifndef REDIS

#define REDIS

#include<iostream>

#include<string.h>

#include<hiredis/hiredis.h>

 

#include<qlist.h>

#include<qdatastream.h>

#include <qmap.h>

#include<QFile>

#include <QtDebug>

using namespace std;

class redis

{

public:

 

    void connect(char* ip,int port)      //连接redis的函数

    {

        this->c = redisConnect(ip, port); //redisConnect 参数值是redis的IP和接口

        if(c != NULL && c->err)             //返回值c是程序与redis传输的一个接口

        {

            cout<<"Error:"<<c->errstr<<endl;

            redisFree(c);

        }

        cout<<"successful connection."<<endl;

    }

 

 

 

    void del(char *key)            //删除函数

    {

        char l[20] = "DEL ";

        strcat(l,key);

        reply =(redisReply*)redisCommand(c,l);  //del key命令删除key的值

        //freeReplyObject(reply);  //redisCommand函数返回值类型不是redisReply,需要转

    }

 

    void serialist(QList<QString> &list)//将qlist序列化后编码函数

    {

        QByteArray ab2;

        QDataStream outStream(&ab2, QIODevice::WriteOnly);

        outStream << list;

        aa=ab2.toBase64();     //将序列化后的数据编码成为64位ASCII码

 

    }

    void wl(char* key)                      //write list

    {

        char* ab = aa.data();//将编码后的数据转化成char*类型

        char* mid = (char*)malloc((strlen("lpush ")+strlen(key)+strlen(" ")+strlen(ab))*sizeof(char)+1);//动态分配内存空间

        strncat(mid,"lpush ",10);

        strcat(mid,key);

        strcat(mid," ");

        strcat(mid,ab);

        reply = (redisReply*)redisCommand(c,mid);//redis命令lpush key value

        //cout<<reply->type<<endl;

 

        if((reply->type == REDIS_REPLY_ERROR))//如果程序执行错误,返回错误原因

        {

            cout<<reply->str<<endl;

            cout<<reply->len<<endl;

 

        }

        freeReplyObject(reply);

        free(mid);

    }

 

  void rr(char* key)                                     //read list

    {

      char* l = (char*)malloc((strlen("lrange ")+strlen(key)+strlen(" 0 -1"))*sizeof(char)+1);

        strcpy(l,"lrange ");

        strcat(l,key);

        strcat(l," 0 -1");

        reply =(redisReply*)redisCommand(c,l);//redis命令 lrange key 0 -1

        if(reply->type == REDIS_REPLY_ARRAY)

        {

 

            for(long j = 0;j < reply->elements;j++)//遍历需要取出的文件解码后存入readl

             {

                   readl.append( QByteArray::fromBase64(reply->element[j]->str));

             }

        }

     }

 

    void printflist()//反序列化并打印

    {

        QDataStream inStream(&readl, QIODevice::ReadOnly);

        QList<QString> aa2 ;

        inStream>>aa2;

        qDebug()<<aa2;

 

    }

private:

    redisContext* c;

    redisReply* reply;

    QByteArray aa;

    QByteArray readl;

 

 

 

 

 

};

 

 

#endif // REDIS

 

 

#include"redis1.h"

#include<time.h>

int main()

{

   QList<QString> list;

 

   for(int i= 0 ;i<12000000;i++)//构建需要序列化的qlist

    {

        char val[10];

        char ab[100] = "asdfghj";

        sprintf(val,"%d",i);

        strncat(ab,val,100);

        QString str1;

        str1= QString(QLatin1String(ab));

 

        list<<str1;

    }

     redis r;

    r.connect("127.0.0.1",6379);//连接redis

     double duration;

    clock_t start, finish;//构建时间监视器,看程序运行时间

    start = clock();

    r.serialist(list);

    list.clear();//释放qlist内容。

    r.wl("liyayat1");

    //r.del("liyayat1");

    r.rr("liyayat1");

    r.printflist();

    finish = clock();

    duration = (double)(finish - start)/CLOCKS_PER_SEC;

    cout<<duration<<endl;

    return 0;

}


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3711/viewspace-3131558/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Class文件格式
请登录后发表评论 登录
全部评论

注册时间:2019-07-09

  • 博文量
    160
  • 访问量
    1180