memcached简介和使用

来源:互联网 发布:linux查看二进制文件 编辑:程序博客网 时间:2024/05/21 13:56

memcached简介

               memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

               memcached特征:1)协议简单(基于简单的文本行的协议)
                                                  2)基于libevent的事件处理
                                                  3)内置内存存储方式

                                                  4)不互相通信的分布式

               组成  client software(给出一组可用的memcached服务器)    
                         client-based hashing algorithm(选择服务器)
                         Server software(保存key/values)
                         Server algorithms(去除旧数据,或者重用内存)

               Memcached基于一个存储键/值对的hashmap

               Items are made up of a key, an expiration time(0表示从不,最多过期时间30天), optional flags, and raw data.(提交的数据必须提前序列化,数据为string或者数组)

               所有复杂度为O(1)

安装

              需要先安装libevent
              tar zxvf libevent-2.0.20-stable.tar.gz
              cd libevent-2.0.20-stable
              ./configure --prefix=/usr/local/libevent
              make
              make install

              tar zvxf memcached-1.4.14.tar.gz
              cd memcahced-1.4.14.tar.gz
              ./configure --prefix=/usr/local/memcached
              make
              make install

启动选项

              /usr/local/memcached/bin/memcached -p(端口) 11211(默认) -m(内存) 64m(默认) -d(作为deamon在后台启动)-vv(将调试信息输出控制台)-u root -l 127.0.0.1 -c 1024(默认)

主要事项

             memcached基本协议:set get add replace delete incr decr

             数据存储方式:Slab Allocation

                                         Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。

                                         page             分配给slab的内存空间,默认1MB
                                         chunk           用于缓存记录的内存空间
                                         slab class   特定大小的chunk组

                                         memcached根据收到的数据的大小,选择最适合数据大小的slab。
                                         memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

                                         解决的内存碎片的问题,但出现内存效率利用不高

            数据过期方式:Lazy Expiration
                                        memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。 memcached不会在过期监视上耗费CPU时间。

                                        LRU
                                       memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

            检查运行时配置:echo "stats settings" | nc localhost 11211

            所有client功能包括:hash,一致的hash算法 可以保存string和二进制数据 可以序列化数据 不能存储复杂结构 对象必须转换成数组 可以压缩数据 有连接时间

            监视memcached服务器: telnet localhost 11211
                                                         stats
                                       1)curr_connections不能太接近最大连接数
                                       2)listen_disabled_num 保持不增加或接近0
                                       3)accepting_conns 为1或0
                                       4)limit_maxbytes 确认分配值
                                       5)cmd_flush
                                             避免内存交换(内存不够时,会将部分内容写入磁盘,这时磁盘叫交换空间,页面会被交换到内存,如果没有足够的内存,会被交换到其他的交换空间中去。linux就会波动不正常)

            memcached把数据保存在内存中,出现故障后会丢失数据,在少量服务器上使用memcached意义不大,因为数据库本身也需要足够内存,适用与分布式环境

memcached与C++使用

             安装libmemcached库
                                   tar zxvf libmemcached-1.0.11.tar.gz
                                   cd libmemcached-1.0.11
                                   ./configure --prefix=/usr/local/libmemcached
                                   make
                                   make install

            简单测试代码

#ifndef  MEMCACHED_H
#define  MEMCACHED_H

#include <iostream>
#include <string>
#include <time.h>
#include "libmemcached/memcached.h"
using std::cout;
using std::endl;
using std::string;

class Memcached
{
   private:
      memcached_st *memc;
   public:
      Memcached()
      {
         const char *s="127.0.0.1";
         memcached_return_t rc;
         memcached_server_st *server=NULL;

         memc=memcached_create(NULL);
         server=memcached_server_list_append(server,s,11211,&rc);
         rc=memcached_server_push(memc,server);
         if(rc!=MEMCACHED_SUCCESS)
           cout<<"memcached_server_push failed! rc: "<<rc<<endl;
         memcached_server_free(server);
      };

      ~Memcached()
      {
        memcached_free(memc);
      };

      bool set(const char *key,const char *value,time_t expiration=3)
      {
        
         if(key==NULL||value==NULL)
         {    
            cout<<"key or value is null"<<endl;
            return false;
         }
         uint32_t flags=0;
         memcached_return_t rc=memcached_set(memc,key,strlen(key),value,strlen(value),expiration,flags);
         if(rc!=MEMCACHED_SUCCESS)
         {
            cout<<"memcached set is failed!"<<endl;
            const char *s=memcached_strerror(memc,rc);
           cout<<"error message : "<<s<<endl;
            cout<<"delete error! rc : "<<rc<<endl;
            return false;
         }
         return true;
      };

      string get(const char *key)
      {
         if(key==NULL)
           return " ";
         size_t value_length;
         uint32_t flags=0;
         memcached_return_t rc;
        char *value=memcached_get(memc,key,strlen(key),&value_length,&flags,&rc);
         if(rc==MEMCACHED_SUCCESS)
            return value;
         return " ";
      };

      bool del(const char *key)
      {
         time_t expiration=0;
         if(key==NULL)
           return false;
         memcached_return_t rc=memcached_delete(memc,key,strlen(key),expiration);
         if(rc!=MEMCACHED_SUCCESS)
         {
          const char *s=memcached_strerror(memc,rc);
           cout<<"error message : "<<s<<endl;
           cout<<"delete error! rc : "<<rc<<endl;
           return false;
         }
         return true;
      }
};
#endif

error while loading shared libraries: libmemcached.so.11: cannot open shared object file: No such file or directory

解决方法(可以解决大部分找不到lib库的问题)

                 whereis     libmemcached.so.11 (查找位置)

                 ldd   执行文件的路径 (会显示出缺少哪些lib)

                 LD_DEBUG=libs  执行文件 -v  (主要看path,找到搜索路径)

                 ln -s  libmemcached.so.11原位置    找到的搜索路径目录 (做软连接)

                 ldd   执行文件的路径(检查是否成功)

PS:原来做的笔记,可能有些没有记清楚,会有问题,但用搜索都能解决问题。

原创粉丝点击