简介
Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH表,该表以Key-value对的方式存在内存中。
准备
- 下载:http://memcached.org/ 下载 memcached-1.4.20.tar.gz 的文件
- 系统环境 Libevent是一套C开发的程序库(后续再讲) yum -y install gcc-c++ libevent libevent-devel
安装
- install memcached
tar xzf memcached-1.4.20.tar.gz
cd memcached-1.4.20
./configure
make && make install
使用
- 设置为服务 保存以下代码到/etc/init.d/memcached
#! /bin/sh
#
# chkconfig: - 55 45
# description: The memcached daemon is a network memory cache service.
# processname: memcached
# config: /etc/sysconfig/memcached
# Source function library - for other linux
#. /etc/rc.d/init.d/functions
# Source function library - for SUSE linux
. /etc/init.d/functions
PORT=11211
USER=root
MAXCONN=128
CACHESIZE=128
OPTIONS=""
if [ -f /etc/sysconfig/memcached ];then
. /etc/sysconfig/memcached
fi
# Check that networking is up.
. /etc/sysconfig/network
if [ "$NETWORKING" = "no" ]
then
exit 0
fi
RETVAL=0
prog="memcached"
start () {
echo -n $"Starting $prog: "
# insure that /usr/local/memcached has proper permissions
chown $USER /usr/local/bin/memcached
/usr/local/bin/memcached -l 127.0.0.1 -d -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P /tmp/memcached.pid $OPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/memcached
}
stop () {
echo -n $"Stopping $prog: "
killproc memcached
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then
rm -f /var/lock/subsys/memcached
rm -f /usr/local/memcached/memcached.pid
fi
}
restart () {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status memcached
;;
restart|reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/memcached ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}"
exit 1
esac
exit $?
- 默认配置文件
/usr/local/bin/memcached -h
memcached 1.4.20
-p 指定端口号(默认11211)
-m 指定最大使用内存大小(默认64MB)
-c 最大同时连接数,默认是1024
-t 线程数(默认4)
-l 连接的IP地址, 默认是所有IP
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
- 设置为自启动
chmod +x /etc/init.d/memcached
chkconfig --add memcached
chkconfig memcached on #设置开机启动
service memcached start
-
使用 todo
-
内存管理机制
memcached中保存的数据都存储在memcached内置的内存存储空间中。因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU算法自动删除不使用的缓存。 数据存储方式:Slab Allocation 结构图如下:
Slab Allocation的主要术语
Page 分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。
Chunk 用于缓存记录的内存空间,每个Chunk里面都是分配同样的数值大小
Slab Class 特定大小的chunk的组。
memcached根据收到的数据的大小,选择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。 数据过期方式:Lazy Expiration + LRU Lazy Expiration memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过 期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。 LRU memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不 足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。 6. 优化 todo
扩展阅读
- memcached完全剖析--1. memcached的基础
- memcached全面剖析--2.理解memcached的内存存储
- 简单理解Memcached的Slab Allocation
- Memcached深入分析及内存调优