08年的时候接触过Memcached,当时还对它的客户端产品嗤之以鼻,毕竟手工代码没有各种ORM原生XML配置方便。尽管如此,Memcached现在已经成了服务器架构里不可或缺的一部分!




相关链接:

Memcached笔记——(一)安装&常规错误&监控

Memcached笔记——(二)XMemcached&Spring集成


Memcached笔记——(三)Memcached使用总结


Memcached笔记——(四)应对高并发攻击






一、下载


1.Libevent

简单的说就是一个事件触发的网络库,Memcached离不开它。

  1. wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.17-stable.tar.gz
wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.17-stable.tar.gz

2.Memcached

今天的主角

  1. wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz

二、安装


1.Libevent

解压缩

  1. tar zxvf libevent-2.0.17-stable.tar.gz
tar zxvf libevent-2.0.17-stable.tar.gz

编译、安装

  1. ./configure --prefix=/usr && make && make install
./configure --prefix=/usr && make && make install 

这里一定要注意指定--prefix,后面配置memcached的时候就有必要用到。

2.Memcached

解压

  1. tar zxvf memcached-1.4.13.tar.gz
tar zxvf memcached-1.4.13.tar.gz

编译、安装

  1. ./configure --with-libevent=/usr/lib && make && make install
./configure --with-libevent=/usr/lib && make && make install

这里一定要指定libevent的路径,否则启动的时候就有找不到libevent的so文件的错误!

启动

  1. memcached -d -m 512 -p
    11211 -u root -c
    256 -P /var/run/memcached.pid
memcached -d -m 512 -p 11211 -u root -c 256 -P /var/run/memcached.pid

参数

引用


-p <num> TCP port number to listen on (default: 11211)

-U <num> UDP port number to listen on (default: 11211, 0 is off)

-l <addr> interface to listen on (default: INADDR_ANY, all addresses)

<addr> may be specified as host:port. If you don't specify

a port number, the value you specified with -p or -U is

used. You may specify multiple addresses separated by comma

or by using -l multiple times

-d run as a daemon

-u <username> assume identity of <username> (only when run as root)

-m <num> max memory to use for items in megabytes (default: 64 MB)

-M return error on memory exhausted (rather than removing items)

-c <num> max simultaneous connections (default: 1024)

-v verbose (print errors/warnings while in event loop)

-P <file> save PID in <file>, only used with -d option

要关掉memcached

  1. kill -9 `cat /var/run/memcached.pid`
kill -9 `cat /var/run/memcached.pid`  

是否正常?Telnet上去看看

  1. telnet xxx.xxx.xxx.xxx 11211
telnet xxx.xxx.xxx.xxx 11211

然后输入

  1. stats
stats

接着就能看到:

引用


STAT pid 3021

STAT uptime 3621

STAT time 1331261509

STAT version 1.4.13

STAT libevent 2.0.17-stable

STAT pointer_size 64

STAT rusage_user 0.000000

STAT rusage_system 0.000999

STAT curr_connections 6

STAT total_connections 7

STAT connection_structures 7

STAT reserved_fds 20

STAT cmd_get 0

STAT cmd_set 0

STAT cmd_flush 0

STAT cmd_touch 0

STAT get_hits 0

STAT get_misses 0

STAT delete_misses 0

STAT delete_hits 0

STAT incr_misses 0

STAT incr_hits 0

STAT decr_misses 0

STAT decr_hits 0

STAT cas_misses 0

STAT cas_hits 0

STAT cas_badval 0

STAT touch_hits 0

STAT touch_misses 0

STAT auth_cmds 0

STAT auth_errors 0

STAT bytes_read 72

STAT bytes_written 1038

STAT limit_maxbytes 52428800

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4

STAT conn_yields 0

STAT hash_power_level 16

STAT hash_bytes 524288

STAT hash_is_expanding 0

STAT expired_unfetched 0

STAT evicted_unfetched 0

STAT bytes 0

STAT curr_items 0

STAT total_items 0

STAT evictions 0

STAT reclaimed 0

END

上面状况说明Memcached服务正常。

还可以试试get、set、delete、replace

引用
set foo 0 0 3 (保存命令)

bar (数据)

STORED (结果)

get foo (取得命令)

VALUE foo 0 3 (数据)

bar (数据)

输入

  1. quit
quit

退出。



三、系统服务


参照Nginx的系统服务,自己写了一个Memcached的系统服务脚本。


先构建/etc/init.d/memcahed这个文件,然后赋予其可执行权限:

  1. touch /etc/init.d/memcached
  2. chmod +x /etc/init.d/memcached
touch /etc/init.d/memcached
chmod +x /etc/init.d/memcached

memcached脚本如下:

  1. #!/bin/bash
  2. # v.0.0.1
  3. # create by snowolf at 2012.5.25
  4. #
  5. # memcached - This shell script takes care of starting and stopping memcached.
  6. #
  7. # chkconfig: - 90
    10
  8. # description: Memcache provides fast memory based storage.
  9. # processname: memcached
  10. memcached_path="/usr/local/bin/memcached"
  11. memcached_pid="/var/run/memcached.pid"
  12. memcached_memory="1024"
  13. # Source function library.
  14. . /etc/rc.d/init.d/functions
  15. [ -x $memcached_path ] || exit 0
  16. RETVAL=0
  17. prog="memcached"
  18. # Start daemons.
  19. start() {
  20. if [ -e $memcached_pid -a ! -z $memcached_pid ];then
  21. echo $prog" already running...."
  22. exit 1
  23. fi
  24. echo -n $"Starting $prog "
  25. # Single instance for all caches
  26. $memcached_path -m $memcached_memory -l 0.0.0.0 -p
    11211 -u root -d -P $memcached_pid
  27. RETVAL=$?
  28. [ $RETVAL -eq 0 ] && {
  29. touch /var/lock/subsys/$prog
  30. success $"$prog"
  31. }
  32. echo
  33. return $RETVAL
  34. }
  35. # Stop daemons.
  36. stop() {
  37. echo -n $"Stopping $prog "
  38. killproc -d 10 $memcached_path
  39. echo
  40. [ $RETVAL = 0 ] && rm -f $memcached_pid /var/lock/subsys/$prog
  41. RETVAL=$?
  42. return $RETVAL
  43. }
  44. # See how we were called.
  45. case "$1" in
  46. start)
  47. start
  48. ;;
  49. stop)
  50. stop
  51. ;;
  52. status)
  53. status $prog
  54. RETVAL=$?
  55. ;;
  56. restart)
  57. stop
  58. start
  59. ;;
  60. *)
  61. echo $"Usage: $0 {start|stop|status|restart}"
  62. exit 1
  63. esac
  64. exit $RETVAL
#!/bin/bash
# v.0.0.1
# create by snowolf at 2012.5.25
#
# memcached - This shell script takes care of starting and stopping memcached.
#
# chkconfig: - 90 10
# description: Memcache provides fast memory based storage.
# processname: memcached memcached_path="/usr/local/bin/memcached"
memcached_pid="/var/run/memcached.pid"
memcached_memory="1024" # Source function library.
. /etc/rc.d/init.d/functions [ -x $memcached_path ] || exit 0 RETVAL=0
prog="memcached" # Start daemons.
start() {
if [ -e $memcached_pid -a ! -z $memcached_pid ];then
echo $prog" already running...."
exit 1
fi echo -n $"Starting $prog "
# Single instance for all caches
$memcached_path -m $memcached_memory -l 0.0.0.0 -p 11211 -u root -d -P $memcached_pid
RETVAL=$?
[ $RETVAL -eq 0 ] && {
touch /var/lock/subsys/$prog
success $"$prog"
}
echo
return $RETVAL
} # Stop daemons.
stop() {
echo -n $"Stopping $prog "
killproc -d 10 $memcached_path
echo
[ $RETVAL = 0 ] && rm -f $memcached_pid /var/lock/subsys/$prog RETVAL=$?
return $RETVAL
} # See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
RETVAL=$?
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 1
esac
exit $RETVAL

注意这几行配置,请根据实际情况配置memcached执行文件路径,以及Memcached使用内存大小:

引用
memcached_path="/usr/local/bin/memcached"

memcached_memory="1024"

追加为系统服务:

  1. chkconfig --add memcached
  2. chkconfig memcached on
chkconfig --add memcached
chkconfig memcached on

然后就可以通过service memcached start|stop|status|restart控制memcached了!




四、常规错误


一开始没有指定libevent路径安装memcached的时候,启动memcached就报这个错误:

引用
memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

其实这个文件就在/usr/lib下。错就错在Linux是64bit系统,如果没有指定libevent路径,memcached就会去/usr/lib64下去找。


找到这个文件

  1. whereis libevent-2.0.so.5
whereis libevent-2.0.so.5
引用
libevent-2.0.so: /usr/lib/libevent-2.0.so.5
  1. ldd /usr/local/bin/memcached
ldd /usr/local/bin/memcached

提示找不到libevent-2.0.so.5

引用
linux-vdso.so.1 => (0x00007fff41dfd000)

libevent-2.0.so.5 => not found

librt.so.1 => /lib64/librt.so.1 (0x0000003c94a00000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c93a00000)

libc.so.6 => /lib64/libc.so.6 (0x0000003c92e00000)

/lib64/ld-linux-x86-64.so.2 (0x0000003c92a00000)

定位

  1. LD_DEBUG=libs /usr/local/bin/memcached -v
LD_DEBUG=libs /usr/local/bin/memcached -v
引用
19905: find library=libevent-2.0.so.5 [0]; searching

19905: search path=/usr/lib/lib/tls/x86_64:/usr/lib/lib/tls:/usr/lib/lib/x86_64:/usr/lib/lib (RPATH from file /usr/local/bin/memcached)


19905: trying file=/usr/lib/lib/tls/x86_64/libevent-2.0.so.5

19905: trying file=/usr/lib/lib/tls/libevent-2.0.so.5

19905: trying file=/usr/lib/lib/x86_64/libevent-2.0.so.5

19905: trying file=/usr/lib/lib/libevent-2.0.so.5

19905: search cache=/etc/ld.so.cache

19905: search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64 (system search path)


19905: trying file=/lib64/tls/x86_64/libevent-2.0.so.5

19905: trying file=/lib64/tls/libevent-2.0.so.5

19905: trying file=/lib64/x86_64/libevent-2.0.so.5

19905: trying file=/lib64/libevent-2.0.so.5

19905: trying file=/usr/lib64/tls/x86_64/libevent-2.0.so.5

19905: trying file=/usr/lib64/tls/libevent-2.0.so.5

19905: trying file=/usr/lib64/x86_64/libevent-2.0.so.5

19905: trying file=/usr/lib64/libevent-2.0.so.5

19905:

/usr/local/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

注意这句:

引用
19905: trying file=/usr/lib64/libevent-2.0.so.5

做个软连接

  1. ln -s /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
ln -s /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

再试试:

  1. ldd /usr/local/bin/memcached
ldd /usr/local/bin/memcached

这回找到了!

引用
linux-vdso.so.1 => (0x00007fffffef6000)

libevent-2.0.so.5 => /usr/lib64/libevent-2.0.so.5 (0x00002b5608a26000)

librt.so.1 => /lib64/librt.so.1 (0x0000003c94a00000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c93a00000)

libc.so.6 => /lib64/libc.so.6 (0x0000003c92e00000)

/lib64/ld-linux-x86-64.so.2 (0x0000003c92a00000)

五、监控


可以在服务器上配置一个PHP页面来监测Memcached的情况,

下载MemcachePHP









配置也比较简单,主要包括账户配置,以及Memcached Server地址配置。

  1. define('ADMIN_USERNAME','memcache');
    // Admin Username
  2. define('ADMIN_PASSWORD','password');
    // Admin Password
  3. define('DATE_FORMAT','Y/m/d H:i:s');
  4. define('GRAPH_SIZE',200);
  5. define('MAX_ITEM_DUMP',50);
  6. $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211';
    // add more as an array
  7. $MEMCACHE_SERVERS[] = 'mymemcache-server2:11211';
    // add more as an array
define('ADMIN_USERNAME','memcache'); 	// Admin Username
define('ADMIN_PASSWORD','password'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50); $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array

常见错误:

引用
Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting
this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /home/usr/local/apache.../memcache.php on line 726

在memcache.php顶端加上“date_default_timezone_set('Asia/Hong_Kong');”即可,具体地域设置参考:http://www.php.net/manual/zh/datetime.configuration.php#ini.date.timezone




如果不方便搭建PHP服务,可以使用Perl脚本memcache-top


修改@default_instances或使用--instances参数:

  1. perl memcache-top-v0.6 --instances
    10.11.155.26
    10.11.155.41
perl memcache-top-v0.6 --instances 10.11.155.26 10.11.155.41






先到这里,后续做压力测试,Java客户端开发,Spring系统集成等。




相关链接:

Memcached笔记——(一)安装&常规错误&监控

Memcached笔记——(二)XMemcached&Spring集成


Memcached笔记——(三)Memcached使用总结


Memcached笔记——(四)应对高并发攻击

Memcached笔记——(一)安装&常规错误&监控的更多相关文章

  1. Memcached理解笔记1---安装&常规错误&监控

    一.下载 1.Libevent 简单的说就是一个事件触发的网络库,Memcached离不开它. wget http://cloud.github.com/downloads/libevent/libe ...

  2. Memcached笔记——(四)应对高并发攻击【转】

    http://snowolf.iteye.com/blog/1677495 近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最 ...

  3. Memcached笔记——(四)应对高并发攻击

    近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Mis ...

  4. Memcached笔记——(三)Memcached使用总结

    为了将N个前端数据同步,通过Memcached完成数据打通,但带来了一些新问题: 使用iBatis整合了Memcached,iBatis针对每台server生成了唯一标识,导致同一份数据sql会产生不 ...

  5. Memcached笔记——(二)XMemcached&Spring集成

    今天研究Memcached的Java的Client,使用XMemcached 1.3.5,做个简单的测试,并介绍如何与Spring集成. 相关链接: Memcached笔记--(一)安装&常规 ...

  6. Windows Server 2008安装Memcached笔记

    分布式缓存系统Memcached简介与实践 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然 ...

  7. LNMP笔记:安装 Xcache 缓存扩展,降低服务器负载

    LNMP笔记:安装 Xcache 缓存扩展,降低服务器负载 2014/11/27 教程笔记 4,743 14     WordPress 精品主机推荐:恒创主机 | 阿里云(本站目前所用云主机) 倡萌 ...

  8. Memcached和Memcache安装(64位win7)

    一.Memcached和Memcache的区别: 网上关于Memcached和Memcache的区别的理解众说纷纭,我个人的理解是: Memcached是一个内存缓存系统,而Memcache是php的 ...

  9. memcache与memcached介绍及安装配置

    也许大家一看到Memcache和Memcached会有点晕,这两者有什么关系又有什么区别呢,下面先给大家说下Memcached,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应 ...

随机推荐

  1. 专业程序设计part2

    05tue 乘以1.0使得int*int!=0 today:缩放 和计算机图形学关联 已知:currentdataset ask for:两个方向的缩放比例.保存路径.重采样方法(necessary) ...

  2. Codeforces 1294C - Product of Three Numbers

    题目大意: 给定一个n,问是否存在3个互不相同的,大于等于2的整数,满足a*b*c=n 解题思路: 可以把abc其中任意两个看作一个整体,例如a*b=d,那么可以发现d*c=n 所以d和c是n的因子 ...

  3. MySql 相关面试题

    1.mysql 慢查询 目的:通过慢查询日志,记录超过指定时间的 SQL 语句,优化 sql 查询 步骤:查看慢查询开启状态-->设置慢查询 http://www.cnblogs.com/luy ...

  4. BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)

    这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...

  5. pix2pix-tf官方文档

    # 对抗网络的基本思想 # 假设有一种概率分布M,它相对于我们是一个黑盒子.为了了解这个黑盒子中的东西是什么,我们构建了两个东西G和D, # G是另一种我们完全知道的概率分布,D用来区分一个事件是由黑 ...

  6. 大言不惭 swank? talk about sth or speak too confidently cán,意思是指说大话而毫不感到难为情。出自《论语·宪问》:“子曰:‘其言之不怍,则为之也难。’”宋·朱熹注:“大言不惭,则无必为之志,而不自度其能否也。欲践其言,其不难哉!” 是不是类似于 swank?

    大言不惭 swank? talk about sth or speak too confidently cán,意思是指说大话而毫不感到难为情.出自<论语·宪问>:“子曰:‘其言之不怍,则 ...

  7. idea快捷键(最常用)

    --跳到上一空白行 ctrl+alt+enter --跳到下一空白行 shift+enter --为代码生成包裹快(try catch等) ctrl+alt+t --跳到某行 ctrl+g --实现父 ...

  8. E - Ingredients 拓扑排序+01背包

    题源:https://codeforces.com/gym/101635/attachments 题意: n行,每行给定字符串s1,s2,s3代表一些菜谱名.s2和s3是煮成是的必要条件,然后给出c和 ...

  9. 静态、动态cell区别

    静态cell:cell数目固定不变,图片/文字固定不变(如qq设置列表可使用静态cell加载) 动态cell:cell数目较多,且图片/文字可能会发生变化(如应网络请求,淘宝列表中某个物品名称或者图片 ...

  10. 使用tomcat方式实现websocket即时通讯服务端讲解

    使用tomcat方式实现websocket即时通讯服务端讲解 第一种方案:使用Tomcat的方式实现 tomcat版本要求:tomcat7.0+.需要支持Javaee7 导入javeee-api的ja ...