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:原来做的笔记,可能有些没有记清楚,会有问题,但用搜索都能解决问题。