源地址:http://kb.cnblogs.com/page/42731/linux
仔细学习了下,如下是记录的笔记备忘内容。web
1、memcached是什么?
memcached是高性能的分布式内存缓存服务器。
通常使用目的是,经过缓存数据库查询结果,减小数据库访问次数,以提升动态web应用的速度、提升可扩展性算法
memcached的特征:
1. 协议简单
2. 基于libevent的事件处理
3. 内置内存存储方式
4. memcached不互相通讯的分布式数据库
协议简单:
memcached使用简单文本行的协议,所以经过telnet也能在memcached上保存数据,取得数据。
基于libevent的事件处理
libevent是一个程序库,它将linux的epoll、BSD类操做系统的kqueue等事件处理功能封装成统一的接口。
memcached使用这个libevent库,所以在linux、BSD等操做系统上发挥高性能。
内置内存存储方式
memcached中保存的数据都存储在memcached内置的内存存储空间中。因为数据仅存储在内存中,所以重启memcached、重启操做系统会致使所有数据的丢失。内容容量达到指定值以后,就基于LRU算法自动删除不使用的缓存。memcached自己是为缓存而设计的服务器,所以没有考虑数据的永久性问题。
memcached不互相通讯的分布式
各个memcahced不会互相通讯已共享信息,如何进行分布式,是由客户端来实现的缓存
memcached安装
在安装memcahced以前,首先要安装libevent库bash
# tar xf libevent-2.0.21-stable.tar.gz # cd libevent-2.0.21 # ./configure --prefix=/usr/local/libevent # make && make install # echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf # ldconfig # tar xf memcached-1.4.15.tar.gz # cd memcached-1.4.15 # ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent # make && make install
memcached 编译安装时,启动脚本:服务器
#!/bin/bash # # Init file for memcached # # chkconfig: - 86 14 # description: Distributed memory caching daemon # # processname: memcached # config: /etc/sysconfig/memcached . /etc/rc.d/init.d/functions ## Default variables PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="" RETVAL=0 prog="/usr/local/memcached/bin/memcached" desc="Distributed memory caching" lockfile="/var/lock/subsys/memcached" start() { echo -n $"Starting $desc (memcached): " daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS RETVAL=$? [ $RETVAL -eq 0 ] && success && touch $lockfile || failure echo return $RETVAL } stop() { echo -n $"Shutting down $desc (memcached): " killproc $prog RETVAL=$? [ $RETVAL -eq 0 ] && success && rm -f $lockfile || failure echo return $RETVAL } restart() { stop start } reload() { echo -n $"Reloading $desc ($prog): " killproc $prog -HUP RETVAL=$? [ $RETVAL -eq 0 ] && success || failure echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; restart) restart ;; condrestart) [ -e $lockfile ] && restart RETVAL=$? ;; reload) reload ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" RETVAL=1 esac exit $RETVAL
主配置文件:/etc/sysconfig/memcached PORT="11211" # memcached端口 USER="memcached" # 启动用户 MAXCONN="1024" # 最大链接数 CACHESIZE="64" # 内存缓存空间大小,单位:M OPTIONS="" # 其余选项 memcached客户端链接 telnet ip:port 保存数据
向memcached保存数据的方法有:
add、replace、set
my $add = $memcached->add( '键', '值', '期限' );
my $replace = $memcached->replace( '键', '值', '期限' );
my $set = $memcached->set( '键', '值', '期限' );
向memcached保存数据时能够指按期限(秒)。不指按期限memcached按照LRU算法保存数据。上面三个方法的区别:
add: 仅当存储空间中不存在键相同的数据时才保存
replace: 仅当存储空间中存在键相同的数据时才保存
set: 与add和replace不一样,不管什么时候都保存
获取数据分布式
获取数据使用get 和 get_multi 方法
一次获取多条数据时使用get_multi,能够非同步的同时取得多个键值,速度要比循环调用get快数十倍
my $val = $memcached->get('键');
my $val = $memcached->get_multi('键1', '键2', '键3', '键4', '键5');
删除数据
删除数据使用delete方法
$memcached->delete('键', '阻塞时间(秒)');
删除第一个参数指定键的数据,第二个参数指定一个时间值,能够禁止使用一样的键保存新数据。此功能能够用于防止缓存数据的不完整。注意:set函数忽视该阻塞,照常保存数据增一和减一操做
2、memcahced的内存存储机制memcached
slab Allocation机制:整理内存以便重复使用
slab allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定的块,以彻底解决内存碎片问题。
slab Allocation 将分配的内存分割成各类尺寸的块(chunk),并把尺寸相同的块分红组(chunk的集合)
slab allocator 能重复使用已分配的内存目的。也就是说,分配到的内存不会释放,并且重复利用。函数
slab Allocation的主要术语
Page: 内存分配给slab的内存空间,默认是1MB,分配给slab以后根据slab的大小切分红chunk,一个page为4kb
Chunk:用于缓存记录的内存空间
slab class:特定大小chunk的组
在slab中缓存数据的原理:
memcached根据收到数据的大小,选择最适合数据大小的slab,memcached中保存着slab内空闲的chunk的列表,根据该列表选择chunk,而后将数据缓存于其中。
slab Allocator的缺点:
slab allocator 分配的是特定长度的内存所以没法有效利用分配的内存。例如:将100字节的数据缓存到128字节上,剩余的28字节就浪费掉了。
使用Growth Factor进行调优
memcached在启动时指定Growth Factor因子(选项-f),就能够在某种程度上控制slab之间的差别,默认是1.25
设置命令:memcached -f 2 -vv
查看memcahced的内部状态
# telnet 127.0.0.1 11211
stats
查看slabs的使用情况
# memcached-tool 127.0.0.1
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
1 96B 30s 1 1 no 0 0 0
各项含义:
# slab class编号
Item_Size chunk大小
Max_age LRU内最旧的记录的生存时间
Pages 分配给Slab的页数
Count slab内的记录数
Full? Slab内是否含有空闲chunk
这部分不是特别彻底,后期补充,这个脚本对调优很是方便。
3、memcached的删除机制
memcached在数据删除方面有效利用资源,数据不会真正从memcached中消失
lazy Expiration
memcached内部不会监视记录是否过时,而是在get时查看记录的时间戳,检查记录是否过时。这种技术被成为lazy(惰性) expiration,所以memcached不会在过时监视上耗费cpu时间
LRU: 从缓存中有效删除数据的原理
当memcached的内存空间不足时,就从最近未使用的记录中搜索,并将其空间分配给新的记录。新的记录覆盖掉使用最少的chunk
# memcached -M 禁止LRU,通常状况下是很是推荐使用LRU
4、memcached的分布式算法
memcached的分布式
memcached的分布式是由客户端程序库来实现的,这种分布式是memcached最大的特色。
set方法:
首先向memcached中添加'tokyo' 将'tokyo'传给客户端程序库后,客户端实现的算法就会根据'键'来决定保存数据的memcached服务器。
get方法:
获取时也要将要获取的键“tokyo”传递给函数库。 函数库经过与数据保存时相同的算法,根据“键”选择服务器。 使用的算法相同,就能选中与保存时相同的服务器,而后发送get命令。 只要数据没有由于某些缘由被删除,就能得到保存的值。
Cache::Memcached的分布式方法 hash-type主要有两种方法: 1. 取模法:这种算法不适用于memcached分布式,当一台memcached服务器故障,将会形成全部memcached缓存失效。 2. 一致性hash算法:首先求出memcached服务器的哈希值,并将其配置到1-2^32的圆上,而后用一样的方法求出存储数据的键的哈希值,并映射到圆上,而后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。