zoukankan      html  css  js  c++  java
  • memcache研究

    memcache研究

    最近开发了一个数据库,该数据库是利用共享内存做的,测试了下增删改查的性能,想与memcached数据库做个对比,故研究下memcached

    那什么是memcached

    memcached是一个高性能,分布式的内存缓存服务器,通过内存的数据访问来降低对数据库的访问,从而提高动态内容应用网站的速度。

    memcached的特征:

    1) 基于C/S架构,协议简单;

    2) 基于libevent的事件处理;使用libevent进行网络并发连接的处理,能够保持在很大并发情况下,保持快速的相应能力。

    3) 内置内存存储方式;数据存储方式使用Slab Allocation,数据过期方式采用:Lazy Expiration +LRU

    4) 基于客户端的memcached分布式;

    其他的具体的细节可以参考其他参考文档,这里不细说。如果以后深入研究了,会展开分析。

    下面看看怎么安装memcached以及怎么安装客户端,及使用C++代码进行测试

    1. memcached安装

    安装步骤:

    (1)  由于memcached是基于libevent的时间处理,所以安装前先安装libevent,可以从官方网站下载,http://monkey.org/~provos/libevent/,我使用的安装版本是:libevent-1.3.tar.gz

    (2)  安装memcached主程序,可以从官网下载:http://www.danga.com/memcached,我使用的版本是:memcached-1.2.2.tar.gz

    (3)  我这里使用的C/C++ memcached 客户端库:libmemcached,可以从开发库官网下载:http://tangent.org/552/libmemcached.html,我使用的版本是:libmemcached-0.42.tar.gz

    说明:这些资料可以在我的资源空间免费下载:http://download.csdn.net/detail/feitianxuxue/5739345

    安装libevent

    解压文件:tar –zxvf libevent-1.3.tar.gz,进入目录:cd libevent-1.3

    预编译: ./configure --prefix=/usr (路径可以自己配)

    编译和安装:make && make install

    测试是否安装成功: ls -al /usr/lib | grep libevent

    显示:

    lrwxrwxrwx   1 root root       21 07-09 22:14 libevent-1.3.so.1 -> libevent-1.3.so.1.0.3

    -rwxr-xr-x   1 root root   337676 07-09 22:14 libevent-1.3.so.1.0.3

    -rw-r--r--   1 root root   532580 07-09 22:14 libevent.a

    -rwxr-xr-x   1 root root      805 07-09 22:14 libevent.la

    lrwxrwxrwx   1 root root       21 07-09 22:14 libevent.so -> libevent-1.3.so.1.0.3

    安装memcached

    解压文件:tar –zxvf memcached-1.2.2.tar.gz,进入目录: cd memcached-1.2.2

    预编译: ./configure --with-libevent=/usr(该路径参考libevent的安装路径)

    编译和安装:make && make install

    安装完毕后,会存放默认路径: /usr/local/bin/memcached

    测试是否安装成功:ls -al /usr/local/bin/mem*

    -rwxr-xr-x 1 root root 142346 07-11 09:27 /usr/local/bin/memcached

    -rwxr-xr-x 1 root root 152004 07-11 09:27 /usr/local/bin/memcached-debug

    安装C/C++ memcached 客户端库:libmemcached

    解压文件:tar –zxvf libmemcached-0.42.tar.gz,进入目录: cd  libmemcached-0.42

    预编译: ./configure --prefix=/usr (路径可以自己配)

    编译和安装:make && make install

    测试是否安装成功:

    检查库文件:ls /usr/lib/libmemcache*

    检查头文件:ls /usr/include/libmemcached/*

    检查命令行工具:ls /usr/bin/mem*

    自此,所有的库都安装好了,可以开始工作了

    2. 启动memcached服务端

    进入:cd  /usr/local/bin/,可以利用./memcached –h看到一些帮助信息

    运行:./memcached -u root –d,这里-d选项是启动一个守护进程,-u是运行Memcache的用户

    默认启动TCP端口是:11211

    可以查看程序运行:ps -ef|grep memcached

    root      2992     1  0 11:20 ?        00:00:00 ./memcached -u root –d

    3.  一个简单的C++测试程序,

    用于连接memcached服务器,添加一条记录,获取一条记录,删除一条记录。

    代码如下:test.cpp

    #include <iostream>
    #include <string>
    #include <libmemcached/memcached.h>
    
    using namespace std;
    
    int main(int argc,char *argv[])
    {
        //connect server
        memcached_st *memc;
        memcached_return rc;
        memcached_server_st *server;
        time_t expiration;
        uint32_t  flags;
        
        memc = memcached_create(NULL);
        server = memcached_server_list_append(NULL,"localhost",11211,&rc);
        rc=memcached_server_push(memc,server);
        memcached_server_list_free(server);
        
        string key = "key";
        string value = "value";
        size_t value_length = value.length();
      size_t key_length = key.length();
      
      
          //Save data
          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;
          }
      
          //Get data
          char* result = memcached_get(memc,key.c_str(),key_length,&value_length,&flags,&rc);
          if(rc == MEMCACHED_SUCCESS)
          {
              cout<<"Get value:"<<result<<" sucessful!"<<endl;
          }
      
          //Delete data
          rc=memcached_delete(memc,key.c_str(),key_length,expiration);
          if(rc==MEMCACHED_SUCCESS)
          {
              cout<<"Delete key:"<<key<<" sucessful!"<<endl;
          }
      
          //free
          memcached_free(memc);
          return 0;
      }

    编译:g++ test.cpp –o test –lmemcached

    运行:[root@localhost test]# ./test1 

    可能会报错:./test1: error while loading shared libraries: libmemcached.so.5: cannot open shared object file: No such file or directory

    "error while loading shared libraries:x.so.x"错误:

    原因:执行某些外部程序的时候可能会提示找不到共享库的错误

    1) 操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对遇到这种情况那就去网上下载并安装上即可.
    2) 已经安装了该共享库但执行需要调用该共享库的程序的时候程序按照默认共享库路径找不到该共享库文件. 

    解决方法:

    1如果共享库文件安装到了其它"/lib/usr/lib" 目录下,  但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库. 
    LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库可以设置多个搜索目录这些目录之间用冒号分隔开比如安装了一个mysql/usr/local/mysql目录下其中有一大堆库文件在/usr/local/mysql/lib下面则可以在.bashrc.bash_profileshell里加入以下语句即可:
    export LD_LIBRARY_PATH=/usr/local//lib:$LD_LIBRARY_PATH     export LD_LIBRARY_PATH=/usr/lib

    2 如果共享库文件安装到了/lib/usr/lib目录下那么需执行一下ldconfig命令

    3如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"/lib/usr/lib"目录下那么在执行ldconfig命令前还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf如下:
    # cat /etc/ld.so.conf
    include ld.so.conf.d/*.conf
    # echo "/usr/local/lib" >> /etc/ld.so.conf
    # ldconfig

    结果:

    Save data:value sucessful!

    Get value:value sucessful!

    Delete key:key sucessful!

  • 相关阅读:
    Memcached 分布式缓存系统部署与调试
    nginx_笔记分享_php-fpm详解
    nginx_笔记分享_配置篇
    linux定时任务crond那些事!
    命令passwd报错因inode节点处理记录
    linux下定时任务
    linux内核堆栈
    c语言之单链表的创建及排序
    c语言常见的几种排序方法总结
    Tiny4412之外部中断
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3187095.html
Copyright © 2011-2022 走看看