简介

memcached是免费和开放源代码的高性能分布式内存对象缓存系统,旨在通过减轻数据库负载来加速动态Web应用程序。其有以下特点:
  • 基于简单的文本行协议
  • 全部数据按照k/v形式存放在内存中,无持久化,重启服务数据会丢失
  • 基于libevent异步I/O模型的事件通知机制。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能
  • 节点之间相互独立,实现分布式需要依赖客户端

其一般作为后端数据库的缓存层来减少数据库的压力:

安装memcached

#先安装依赖软件
$ yum install gcc libevent libevent-devel
#源码安装memcached
$ cd /usr/local/src
$ wget http://memcached.org/files/memcached-1.5.2.tar.gz
$ tar -zxvf memcached-1.5.2.tar.gz
$ cd memcached-1.5.2
$ ./configure --prefix=/usr/local/memcached && make && sudo make install

启动

$ /usr/local/memcached/bin/memcached -d -u root -l 192.168.56.10 -p 32054 -m 10 -c 100 -P /tmp/memcached_32054.pid
#选项说明,这里只列出比较重要的选项,具体选项说明使用memcached -h来查阅
-p TCP端口,默认为11211,可以不设置
-U UDP端口,默认为11211,0为关闭
-l 监听的ip地址
-d 守护进程(daemon)
-u 指定用户,如果当前为 root ,需要使用此参数指定用户
-m 最大内存,单位MB。默认64MB,32位操作系统,每个进程最多只能使用2GB,64位无限制
-M 禁止LRU策略,内存耗尽时返回错误,而不是删除数据
-c 最大连接数,默认是1024
-vv 查看日志
-P memcache的pid文件,结束memcache进程:kill `cat /tmp/memcached_32054.pid`
-f 增长因子,默认1.25
-n 初始chunk=key+suffix+value+32结构体,默认48字节
-L 启用大内存页,可以降低内存浪费,改进性能
-t 线程数,默认4。由于memcached采用NIO,所以更多线程没有太多作用
-R 每个event连接最大并发数,默认20
-C 禁用CAS命令(可以禁止版本计数,减少开销)
-I 每次申请内存的页的大小(page),默认1M,最小1k,最大128M
-F 禁用flush_all

查看进程

$ ps -aux | grep memcached
root 1359 0.0 0.3 413804 3132 ? Ssl 13:51 0:00 /usr/local/memcached/bin/memcached -d -u root -p 32054 -m 10 -c 100
root 1372 0.0 0.0 112660 972 pts/0 R+ 13:51 0:00 grep --color=auto memcached

基本命令

命令格式:

<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n
cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n

<command name> 有这么几个: "set", "add", "replace", "append", "prepend"

<flags>是服务器随数据一起存储的任意16位无符号整数(用十进制表示),并在检索项目时返回。 对于memcached的php客户端来说flags=0表示不压缩

$ telnet localhost 32054
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats #查看memcache状态
...
END set name 0 0 3
hioooo
CLIENT_ERROR bad data chunk #超过3个字节存不下
ERROR #设置1个数字
set count 0 0 1
1
STORED #递增
incr count 1
2
incr count 6
8 #递减
decr count 1
7 #设置一个字符串
set myname 0 0 3
pig
STORED #获取
get myname
VALUE myname 0 3
pig
END #不存在则添加
add height 0 0 4
1.75
STORED
add myname 0 0 3
zhu
NOT_STORED #这儿因为myname已经存在,所以返回失败 #替换
replace height 0 0 4
1.60
STORED #向已存在的缓存后面追加内容
append myname 0 0 3
fly
STORED #向已存在的缓存前面追加内容
prepend myname 0 0 3
pig
STORED #gets & cas 控制并发写,gets获得一个id,cas保存的时候带上这个id,如果发现id没变,保存之,并且更新id,如果变了说明数据已经被更新了,保存失败
gets myname
VALUE myname 0 6
pigfly
END
cas myname 0 0 3
zhu
STORED
get myname
VALUE myname 0 3
zhu #设置缓存并且设定过期时间
#有效期可以是UNIX时间戳(从1970年1月1日开始的秒钟数),也可以是距离当前的秒数,对于后者而言,不能超过60*60*24*30(30天)
#下面把有效期设置为100天的秒数的后果就是马上就失效了,完全get不到
#至于设置为100天后的UNIX时间戳是不是能在100天后过期就不知道了,有人测试过记得告诉我~
set phone 0 8640000 11
13847292929
STORED
get phone
END #向已存在的数据设置过期时间
touch myname 10 #删除
delete myname
DELETED
get myname
END #清空所有缓存
flush_all
OK
get myname
END
get myname count
END

状态信息

STAT pid 1359 #memcache服务器的进程ID
STAT uptime 6630 #服务器已经运行的秒数
STAT time 1508917290 #服务器当前的unix时间戳
STAT version 1.5.2 #memcache版本
STAT libevent 2.0.21-stable #libevent版本
STAT pointer_size 64 #当前操作系统的指针大小(32位系统一般是32bit,64就是64位操作系统)
STAT rusage_user #0.835764 seconds the cpu has devoted to the process as the user, cpu投入到进程的累计用户时间
STAT rusage_system 0.685101 #seconds the cpu has devoted to the process as the system, 进程的累计系统时间
STAT max_connections 100 #最大连接数
STAT curr_connections 10 #当前连接数
STAT total_connections 12 #启动以来总的连接数
STAT rejected_connections 0 #拒绝连接数
STAT connection_structures 11 #已分配的连接结构数
STAT reserved_fds 20 #Number of misc fds used internally
STAT cmd_get 2 #get(获取)次数
STAT cmd_set 4 #set(保存)次数
STAT cmd_flush 0 #flush(清空)次数
STAT cmd_touch 0 #更新过期时间次数
STAT get_hits 2 #获取命中次数
STAT get_misses 0 #获取失败次数
STAT get_expired 0 #获取已过期数据的次数
STAT get_flushed 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 133 #读取字节数
STAT bytes_written 159 #写入字节数
STAT limit_maxbytes 10485760 #分配给memcache的内存大小(字节)
STAT accepting_conns 1 #Whether or not server is accepting conns(服务器是否接受连接)
STAT listen_disabled_num 0
STAT time_in_listen_disabled_us 0
STAT threads 4 #当前线程数
STAT conn_yields 0 #连接操作主动放弃数目
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT slab_reassign_rescues 0
STAT slab_reassign_chunk_rescues 0
STAT slab_reassign_evictions_nomem 0
STAT slab_reassign_inline_reclaim 0
STAT slab_reassign_busy_items 0
STAT slab_reassign_busy_deletes 0
STAT slab_reassign_running 0
STAT slabs_moved 0
STAT lru_crawler_running 0
STAT lru_crawler_starts 3825
STAT lru_maintainer_juggles 12722
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 130 #当前存储占用的字节数
STAT curr_items 2 #当前存储的数据总数
STAT total_items 2 #启动以来存储的数据总数
STAT slab_global_page_pool 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evicted_active 0
STAT evictions 0 #为获取空闲内存而删除的items数(分配给memcache的内存用满后需要删除旧的items来得到空间分配给新的items)
STAT reclaimed 0 #已过期的数据条目来存储新数据的数目
STAT crawler_reclaimed 0
STAT crawler_items_checked 10
STAT lrutail_reflocked 0
STAT moves_to_cold 2
STAT moves_to_warm 0
STAT moves_within_lru 0
STAT direct_reclaims 0
STAT lru_bumps_dropped 0

安全

服务器一般有两个网卡,一个指向内网,一个指向外网。由于memcached没有密码验证,如果直接暴露在外网,数据就会随意被他人利用,我们可以有两种方法来限制连接:

1.内网访问,启动memcached的时候加上-l参数,让memcached监听内网ip

$ memcached -d -m 1024  -u root -l 192.168.56.10 -p 32054 -c 1024

  

2.设置防火墙规则

$ iptables -F
$ iptables -P INPUT DROP
$ iptables -A INPUT -p tcp -s 192.168.56.10 --dport 32054 -j ACCEPT
$ iptables -A INPUT -p udp -s 192.168.56.10 --dport 32054 -j ACCEPT

自动重启&监控

memcached有时候会出现进程死掉的情况,这时候只要重启,又可以正常使用。所以我们可以有个监控memcached进程的脚本来实现当memcached进程死掉以后自动重启memcached,可以采用daemondtools,脚本如下:

#!/bin/sh
if [ f
/etc/sysconfig/memcached ];then
. /etc/sysconfig/memcached
fi
exec 2>&1
exec /usr/bin/memcached p
$PORT u
$USER m
$CACHESIZE c
$MAXCONN
$OPTIONS

通过STATS命令可以自己实现脚本来达到监控的目的,php客户端方面有人写了个memcache.php,还可以采用nagios+rrdtool用直观化的图表方式实现:

参考资料

  1. 《memcached全面剖析》
  2. 《nosql数据库入门》
  3. memcached协议

安装memcached的更多相关文章

  1. NoSql1 在Linux(CentOS)上安装memcached及使用

    前言:       今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...

  2. Linux 服务器 安装 memcached

    linux centos 一.memcached的安装 1.下载 memcached-1.4.33.tar.gz.libevent-2.0.22-stable.tar.gz 安装 memcached ...

  3. 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展

    上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...

  4. 在Windows中安装Memcached

    Memcached是一个高并发的内存键值对缓存系统,它的主要作用是将数据库查询结果,内容,以及其它一些耗时的计算结果缓存到系统内存中,从而加速Web应用程序的响应速度. Memcached最开始是作为 ...

  5. CentOS6.3编译安装Memcached

    要用到如下源码包: /usr/local/src/memcached/libevent-2.0.21-stable.tar.gz /usr/local/src/memcached/memcached- ...

  6. CentOS6.3编译安装Memcached的PHP客户端memcache

    在安装Memcached的PHP客户端memcache之前,可先看下先前的工作笔记: PHP5不重新编译,如何安装自带的未安装过的扩展,如soap扩展? 安装PHP的memcache扩展 cd /us ...

  7. 转:xampp-php5.6下安装memcached.exe

    1.下载PHP对应版本的php_memcache.dll,我的PHP 5.6.3 所以下载 ,根据phpinfo输出的信息来找出匹配的版本: (1)看 Compiler,的后缀,一般带有vc11的字样 ...

  8. 在Windows下安装Memcached

    Windows下的Memcache安装: 需要运行命令行工具cmd 请以管理员权限运行 开始->附件->命令提示符,以管理员身份运行 假如当前C:\windows\system32,输入c ...

  9. 手动为php安装memcached扩展模块

    最近公司需要新部署几台服务器,主要就是lnmp平台,这几台服务器需要部署公司的系统,由于本屌刚入职时间不长,加上又是新手,所以对公司的架构一头雾水,前前后后折腾了一个月时间,终于磕磕绊绊的将系统服务器 ...

  10. Centos安装Memcached和(Nginx)Memcache扩展详细教程

    下载memadmin,下载地址:http://www.junopen.com/memadmin/ 并在IIS新建站点. 测试地址:http://wap.yousawang.com/mem , 1.重启 ...

随机推荐

  1. 深入Javascript之this

    前言 近期准备好好的读一读<你不知道的JavaScript(上卷)>这本书,俗话说的好,好记性不如烂笔头,读到this这章感觉是时候需要一些笔记了.文中如有错误之处,欢迎指出. 什么是th ...

  2. 2017web前端面试总结

    2017web前端面试总结 从今年3月份开始面试笔试找实习找校招到现在也半年多了,拿到了不少offer,也有了自己的一点心得体会,这里写出来分享一下,拙见勿喷. 注意一下,以下的观点仅代表我个人的体会 ...

  3. 版本控制之三:SVN合并及解决冲突(转)

    转自 http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html 接下来,试试用TortoiseSVN修改文件,添加文件,删除 ...

  4. 本地存储之localStorage

    localStorage 本地存储 .对象.存数据 .取数据 存储的数据量在20M左右 localStorage 是window下面的属性,用的时候可以省略window 数据只能存储字符串类型的 lo ...

  5. 树莓派链接WiFi设置

    树莓派摆脱网线的束缚 在看这篇文章之前,请确保自己树莓派OS已经正常安装且已经连接网线,然后准备一个无线网卡,开始实现我们的树莓派摆脱网线的束缚吧 ! -_- 一.    安装网卡驱动 1.      ...

  6. Can you solve this equation?

    Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...

  7. kettle闪退问题

    确定Java的配置环境没问题 kettle闪退的时候把spoon.bat里面的配置项改一下 if "%PENTAHO_DI_JAVA_OPTIONS%"=="" ...

  8. git clone 带用户名密码的形式但包含@等特殊符号无法正常解析

    正常使用git clone 的方式 git clone https://remote 使用带用户名密码的方式(可以避免后续每次都要输入用户名密码) git clone https://[usernam ...

  9. gulp一般使用

    gulp的基本使用总结了一下几点: 1.gulp-ejs的使用 [ file include,html文件合并 ]: let ejs = require("gulp-ejs"); ...

  10. ldap数据库--ODSEE--ACI

    查看跟DN下的aci ldapsearch -h hostname -p port -D "cn=Directory Manager" -w - -b "BASE_DN& ...