q4561231 发表于 2015-11-18 12:30:09

C++ MemCache测试报告

1.1、测试代码
Set部分:
void testSingleSet( memcached_st *memc, unsigned int testTimes, string value ){
       unsigned int i = 0;
       memcached_return rc;
       char buf = {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 = {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;
    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位,如果我们将Key和value的长度加倍,进行10万次操作,可以看出对value和key的长度对memcache的性能并没有太大的影响。

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

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