zoukankan      html  css  js  c++  java
  • php写memcached ,c读取乱码问题[转]

    用php寫memcached,用c從memcached讀數據的時候會出現取回的value為亂碼的現象,在百度上查看到的有用php寫,用java讀出亂碼的情況,看到一篇講解說是

        (原文)實現的過程中遇到一個困難:從memcached里取出來的value有時候是亂碼。經過大量的試驗,我發現了一個規律:頁面大小不超過64k的,取出來的值不存在亂碼問題。一旦超過這個值,就變成了亂碼。看來64k是個很敏感的大小。但是memcached的存放單個值的大小最大值是1M。64kb還小的很啊。於是,我試試直接用memcached的服務端命令把600kb的value存入到memcached里,結果是成功了。說明問題是在客戶端了。

        (原文)我查了一下memcached的客戶端(memcached client for java),其中有個方法setCompressEnable(boolean compressEnable),意思是超過多少大小(通過這個setCompressThreshold(long compressThreshold)方法設置大小)就進行壓縮。於是我設置了一下mcc.setCompressEnable(false);再次試驗,成功!!哈哈。。

         看完上面文章後我也嘗試了一下,確實php中set的value在一定位元組數之內是不會有亂碼的,我就在程序中將壓縮取消,結果真的不亂碼了。

     

    用php寫數據到memcached的代碼如下:

           $servers = array(
                array('ip1, 11211, 1),
                 array('ip2', 11222, 1),
           );
           $mc = NULL;

           function initMemd()
           {
                   global $mc;
                   global $servers;
                   if(count($servers) == 0) return false;

                   $mc = new Memcached();
                   if(false === $mc->addServers($servers))
                   {
                           print_r("add mem servers error!");
                           return false;
                   }
                   $ret = $mc->setOption(Memcached::OPT_COMPRESSION, false);
                   if($ret === false)
                   {
                           print_r("set memcached compression option false error!");
                           return false;
                   }
                   return true;

             }

     

             function pushToMemd($items)
             {
                   global $mc;
                   $mc->setMulti($items);
                   if ($mc->getResultCode() == Memcached::RES_NOTSTORED) {
                           print_r("set memcached error");
                   }
              }

    用c讀的程序如下:

    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    #include "libmemcached/memcached.h"
    //gcc 1.c -I/usr/local/libmemcached/include -L /usr/local/libmemcached/lib/ -L /usr/local/lib -lmemcached
    int main(int argc, char *argv[])
    {
           memcached_st *memc;
           memcached_return rc;
           memcached_server_st *servers;

           
           //connect multi server
           memc = memcached_create(NULL);
          servers = memcached_server_list_append(NULL, "ip1", 11211, &rc);
           //servers = memcached_server_list_append(servers, "ip2", 11211, &rc);

           rc = memcached_server_push(memc, servers);
           memcached_server_free(servers);
           

          //Save multi data
           size_t i;
           char *keys[]= {"key1", "key2", "key3"};
           size_t key_length[]= {4, 4, 4};
          char *values[] = {"value1", "value2", "value3"};
           size_t val_length[]= {6, 6, 6};
           for (i=0; i <1; i++)
           {
                   rc = memcached_set(memc, keys[i], key_length[i], values[i], val_length[i], (time_t)180, (uint32_t)0);
                   if (rc == MEMCACHED_SUCCESS)
                   {
                           printf("Save key:%s data:%s success\n",keys[i], values[i]);
                   }
           }

           char return_key[10000];

            size_t return_key_length;
           char *return_value;
           size_t return_value_length;
           uint32_t flags;
           rc = memcached_mget(memc, keys, key_length, 1);
           while ((return_value = memcached_fetch(memc, return_key,&return_key_length, &return_value_length, &flags, &rc))) {
                   if (rc == MEMCACHED_SUCCESS)
                   {
                           printf("Fetch key:%s data:%s , len=%d\n", return_key, return_value, return_value_length);
                   }
           }
     

          //Delete multi data
          for (i=0; i<3; i++)
           {
                   rc = memcached_set(memc, keys[i], key_length[i], values[i], val_length[i], (time_t)180, (uint32_t)0);
                   rc = memcached_delete(memc, keys[i], key_length[i], (time_t)0);
                   if (rc == MEMCACHED_SUCCESS)
                   {
                           printf("Delete %s successn", keys[i], values[i]);
                   }
           }
           //free
           memcached_free(memc);
           return 0;

    }

  • 相关阅读:
    AI---ListPicker的使用
    AI---Screen & Notifier
    Android---开发环境
    Android---App Inventor环境搭建
    OS---host文件
    JAVA---接口与抽象类
    JAVA---类成员的访问权限
    JSP---一个Servlet处理多个请求操作
    hdu 6016
    hdu 6019
  • 原文地址:https://www.cnblogs.com/rooney/p/2573145.html
Copyright © 2011-2022 走看看