Memcached

时间:2021-02-23
本文章向大家介绍Memcached,主要包括Memcached使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的”键值对“存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等;

memcached是LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vosx、 LiveJournal等众多服务中提高Web应用扩展性的重要因素。

Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:

1. 简单key/value存储:服务器不关系数据本身的意义及结构,只要是可序列化数据即可。存储项由”键、过期时间、可选的标志及数据“四个部分组成。
2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据、并负责数据项的超时过期;
3. 各服务器间彼此无视;不再服务期间进行数据同步;
4. O(1)的执行效率
5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预定的时长清理超期数据;但实际上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;
         而且,memcached也不会证照按期清理缓存,而仅是当get命令到达时检查其时长;

Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。

存储类命令: set, add, replace, append, prepend
获取数据类命令: get, delete, incr/decr
统计类命令: stats, stats items, stats slabs, stats sizes
清理命令: flush_all

一、安装libevent
如果是使用rpm包安装可以跳过这一步,yum会自动安装依赖包。

memcached依赖于libevent API,因此要事先安装之,项目主页: http://libevent.org/,可自行选择需要的版本下载。本文采用的是目前最新版本的源码包 libevent-2.0.21-stable.tar.gz
安装过程:

# 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/libeent/lib" > /etc/ld.so.conf.d/libevent.conf
# ldconfig

二、安装配置memcached

1. rpm包安装memcached

# yum install memcached -y
# man memcached

2. 编译安装memcached

# 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

3. memcached SysV的startup脚本代码如下所示,将其建立在/etc/init.d/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="nobody"
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 -o "$OPTIONS"
RETVAL=$?
[ $RETVAL -eq 0 ] && success && touch $lockfile || failuer
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 -HUB
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

使用如下命令配置memcached成为系统服务:

# chmod +x /etc/init.d/memcached
# chkconfig --add memcached
# service memcached start

4、使用telnet命令测试memcached的使用
Memcached提供一组基本命令用于基于命令行调用其服务或查看服务器状态等。

get: reads a value;示例:get mykey
set: set a key unconditionally;示例:set mykey 0 60 5 //0:缓存的标志;60:缓存的有效时长;5:缓存的字节数
add: add a new key;示例:add newkey 0 60 5
replace: overwrite existing key;示例:replace key 0 60 5
append: append data to existing key;示例:append key 0 60 5
prepend: prepend data to existing key;示例:prepend key 0 60 5
incr: increments numerical key value by gien number;示例:incr mykey 2
decr: decrements numerical key value by given number;示例:decr mykey 5
delete: deletes an existing key;示例:delete mykey
flush_all:invalidate specific items immediately;示例:flush_all
flush_all 900 : invalidate all items in n seconds;
stats: prints general statistics;示例: stats
stats slabs: prints memory statistics;示例:stats slabs
stats malloc: prints memory statistics;示例:stats malloc
stats items: print higher level allocation statistics;示例:stats items
stats detail
stats sizes
stats reset: resets statistics;示例: stats reset

5 memcached内存存储机制

memcached是通过slab allocation分配机制来整理内存并且加以复用的。简单来说,它是通过slab alloctor分配器将分配的内存分割成各种尺寸的chunk,然后将尺寸相同的块再组成组来定义。

page: 分配给slab用于再次分割为chunk的内存空间;
chunk:用于缓存缓存对象的空间;
slab class:特定大小的chunk组合而成的组;

我们可以通过如下命令来查看内存分配情况:

# memcached -u memcached -vv
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
slab class 3: chunk size 152 perslab 6898
...
slab class 42: chunk size 1048576 perslab 1

我们可以按需要自行指定增长因子大小:

# memcached -u memcached -vv -f 1.1

要想永久有效,将其写到环境配置中:

# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-f 1.2"

我们可以通过自带的工具memcached-tool查看stats:

# memcached-tool 127.0.0.1
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM

字段意义:

# : slab class的编号;
Item_size: Chunk大小
Max_age: 缓存对象的生存时间
Pages: 分配给slab的内存页数
Count: slab内的记录数
Full?: slab内是否还有空闲chunk

6、memcached的常用选项说明

-s <file>:memcached只向本级提供服务时,可以基于这种方式来提供服务
-l <ip_addr>: 指定进程监听的地址
-d: 将memcached运行为一个守护进程
-u <username>:指明以哪个用户的身份来运行memcached
-m <num>: 用于缓存数据的最大内存空间,默认为64MB
-c <num>:最大支持的并发连接数,默认为1024
-p <num>: 监听在哪个TCP端口上,默认是11211
-U <num>: 监听在哪个UDP端口上,默认是11211; 0表示关闭UDP端口
-M :当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;
-r: 最大可使用的核心文件大小
-f <factor>: 增长因子,指明两个chunk之间的跨度有多大;默认是1.25倍。
-i:显示许可证
-t <threads>: 指明memcached提供服务的线程数,默认是4个
-b <num>:等待队列的长度
-B <proto>:指明协议类型,ascii和binary,二进制格式效率更高,但我们没办法手动解析
-S : 借助SASL(简单认证安全层)进行用户认证
-n: 指定最小的slab chunk大小,单位是字节;

三、安装Memcached的PHP扩展
安装PHP的memcache扩展

# tar xf memcache-2.2.5.tar
# cd memcache-2.2.5
/usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache
# make && make install

上述安装完后会有类似以下的提示

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

编辑/usr/local/php/lib/php.ini,在”动态模块“相关的位置添加如下一行来载入memcache扩展:

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so

而后对memcached功能进行测试,在网站目录中建立测试页面test.php,添加如下内容:

<?php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211) or die("could not connect");

$version = $mem->getVersion();
echo "Server's version: ".$version."<br/>\n";

$mem->set('hellokey', 'Helo World', 0, 600) or die("Failed to save data at the memcached server");
echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";

$get_result = $mem->get('hellokey');
echo "$get_result is from memcached server.";
?>

如果有输出“Hello World is from memcached.”等信息,则表明memcache已经能够正常工作。

四、使用libmemcached的客户端工具
访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping, memstat, memslap等。

1)编译安装libmemcached

# tar xf libmemcached-1.0.2.tar.gz
# cd libmemcached-1.0.2
# ./configure
# make && make install
# ldconfig

2) 客户端工具

# memcat --servers=127.0.0.1:11211 mykey
# memping
# memslap
# memstat

五、 Nging整合memcached

server {
listen 80;
server_name www.ckh.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
set $memcached_key $uri;
memcached_pass 127.0.0.1:11211;
default_type text/html;
error_page 404 @fallback;
}
location @fallback {
proxy_pass http://192.168.2.70;
}
}

原文地址:https://www.cnblogs.com/ckh2014/p/14437540.html