设为首页 收藏本站
查看: 724|回复: 0

[经验分享] C++ MemCache测试报告

[复制链接]

尚未签到

发表于 2015-11-18 12:30:09 | 显示全部楼层 |阅读模式
1.1、测试代码
Set部分:
void testSingleSet( memcached_st *memc, unsigned int testTimes, string value ){
       unsigned int i = 0;
       memcached_return rc;
       char buf[30] = {0};
       struct timeval tpstart,tpend;
    float timeuse;
       gettimeofday(&tpstart,NULL);

       for( i = 0; i < testTimes; i++ ){
           sprintf( buf, "%d", i);
           string key(buf);
           size_t value_length = value.length();
           size_t keyLength = key.length();
        rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
        if(rc !=MEMCACHED_SUCCESS)
        {
            //cout<<"Save data:"<<value<<" sucessful!"<<endl;
               getchar();
        }
       }

       gettimeofday(&tpend,NULL);
    timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
    tpend.tv_usec-tpstart.tv_usec;
    timeuse/=1000000;
    printf("Set %u items Used Time:%f/n", testTimes, timeuse);
}

Get部分:
void testSingleGet( memcached_st *memc, unsigned int testTimes, size_t valueLength ){
       unsigned int i = 0;
       memcached_return rc;
       char buf[30] = {0};
       struct timeval tpstart,tpend;
    float timeuse;
       gettimeofday(&tpstart,NULL);

       for( i = 0; i < testTimes; i++ ){
           sprintf( buf, "%d", i);
           string key(buf);
           size_t value_length = valueLength;
           size_t keyLength = key.length();
           char* result = memcached_get(memc,key.c_str(), keyLength, &value_length, &flags, &rc);
           if(rc != MEMCACHED_SUCCESS)
           {
              //cout<<"Get value:"<<result<<" sucessful!"<<endl;
                  getchar();
           }
       }

       gettimeofday(&tpend,NULL);
    timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
    tpend.tv_usec-tpstart.tv_usec;
    timeuse/=1000000;
    printf("Get %u Used Time:%f/n", testTimes, timeuse);
}

Delete部分:
void testSingleDel( memcached_st *memc, unsigned int testTimes ){
    char buf[20];
    memcached_return rc;

       struct timeval tpstart,tpend;
    float timeuse;
       gettimeofday(&tpstart,NULL);

    for( unsigned int i = 0; i < testTimes; i++ ){
           sprintf( buf, "%d", i);
           string key(buf);
        //string value = "test";
           //string value = "1|1|1301449476|67|33|13272|13272|79|23|7|3|3|74|1|2.000000|4.000000|1.000000|3|3|PandaTest";
        //size_t value_length = value.length();
        size_t key_length = key.length();
        rc=memcached_delete( memc, key.c_str(), key_length, expiration );
        if(rc != MEMCACHED_SUCCESS)
        {
               //cout<<"Delete key:"<<key<<" sucessful!"<<endl;
               getchar();
        }
    }

       gettimeofday(&tpend,NULL);
    timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
    tpend.tv_usec-tpstart.tv_usec;
    timeuse/=1000000;
    printf("Delete %u items Used Time:%f/n", testTimes, timeuse);
}

遍历部分:
memcached_return_t my_memcached_dump_fn(const memcached_st *ptr, const char *key,
              size_t key_length, void *context){
       memCount++;
       return MEMCACHED_SUCCESS;
}

void testList( memcached_st *memc ){
       unsigned int i = 0;
       memcached_return rc;
       //char* context = (char*)malloc(10);
       char* context;
       memcached_dump_fn fn = my_memcached_dump_fn;

       struct timeval tpstart,tpend;
    float timeuse;
       gettimeofday(&tpstart,NULL);

       memcached_dump(memc, &fn, context, 1);

       gettimeofday(&tpend,NULL);
    timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
    tpend.tv_usec-tpstart.tv_usec;
    timeuse/=1000000;
    printf("List %u items Used Time:%f/n",memCount, timeuse);

       printf("The memCount is %u/n", memCount);
}




1.2、测试结果
1.       测试结果说明

从测试数据可以看出来,memcache的删除并不是直接删除的,删除的东西还是存在的,只是无法get出来而已(这个我测试了,get会出错的),而超时的数据和被删除的处理方法是一样的,只是无法get,但是可以遍历找到相应的Key


结果显示,当数据量达到100000后,遍历过的数据和实际插入的数据的数量开始产生差异。说明当数据量到达一定程度之后,遍历出现了问题。而且遍历得到的仅仅是已经缓存在哪里的key的值,不包含其中的value,所以如果做处理的话,还需要将他们get出来。
上述结果都是对长度很短的Key进行操作,长度最多不会超过6位,如果我们将Keyvalue的长度加倍,进行10万次操作,可以看出对valuekey的长度对memcache的性能并没有太大的影响。

3.       仿真测试:
如果将所有的数据进行仿真,然后统计处理仅仅计算delay, loss, openport的平均值,在遍历不出错的情况下,我进行了测试,所需时间大概为2.419011 s,然后处理的数量是40000条。如果数量加大,会出现遍历不到,或者遍历到了但是没有调用回调函数的情况。

2. 使用Memcache可能带来的问题:
1. 因为遍历程序完全可以遍历到那些失效和被删除的k-v对,所以,如果使用memcache,那么我们在遍历的时候会发现我们遍历到了异常多的数据,然后用这些keyget,当get的时候,会对其生命周期和是否被删除进行检查,这时候那些被删除和已经失效的数据将不能get出来,但是已经浪费了大量的时间,同时,如果对于get错误记录日志的话,还会造成日志文件的大量浪费。
  2. 由于遍历程序仅仅能够遍历key,同时对相应的key进行的操作需要在回调函数中解决,所以不能进行复杂的操作,只能将key放入容器中,等待遍历完进行处理,这样需要很多的内存空间。而且这些key中有些是失效的,是的有效利用率更低。
             版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140700-1-1.html 上篇帖子: [文档] Memcache 原理简介 下篇帖子: Memcache缓存技术学习总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表