memcache 的介绍
第一章:memcached 介绍
1-1 memcached 是什么?
memcached 是以LiveJournal 旗下 Danga 公司开发的一款软件。
free & open source, high-performance, distributed memory object caching system
自由&开放源码, 高性能 ,分布式的内存对象缓存系统
1-2 memcached 应用图解
许多 Web应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。但随着数 据量的增大、访问的集中,就会出现 RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大 影响。
这时就该 memcached 大显身手了。memcached 是高性能的分布式内存缓存服务器。一般的使用目的 是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
注 RDBMS:Relational Database Management System
第二章:memcached 基本使用
2-1 memcached 的特性
memcached 作为高速运行的分布式缓存服务器,具有以下的特点
- 协议简单
- 基于 libevent的事件处理
- 内置内存存储方式
- memcached 不互相通信的分布式
协议简单
memcached 的服务器客户端通信并不使用复杂的 XML等格式,而使用简单的基于文本行的协议。 因此,通过 telnet也能在memcached 上保存数据、取得数据。
举个栗子
$ telnet localhost 11211
Trying 127.0.0.1...
命令 | 介绍 |
---|---|
set foo 0 0 3 | (保存命令) |
bar | (数据) |
STORED | (结果) |
get foo | (取得命令) |
VALUE foo 0 3 | (数据) |
bar | (数据) |
2-2 window 下 memcache 安装
打开cmd,用cd命令 切换至memcache目录下
## 一步完成安装
memcached.exe -d install
## 卸载
memcached.exe -d uninstall
2-3 window 下 memcache 启动
## 普通启动
memcached -d start
## 监听端口启动
memcached -p 11212
## 启动 memcache 端口11211 给他分配32M内存并且打印操作信息
memcache.exe -p 11211 -m 32 -vv
命令 | 介绍 |
---|---|
-p <num> | 监听的TCP端口 (缺省: 11211) |
-d | 以守护进程方式运行Memcached |
-u <username> | 运行Memcached的账户,非root用户 |
-m <num> | 最大的内存使用, 单位是MB,缺省是 64 MB |
-c <num> | 软连接数量, 缺省是 1024 |
-v | 输出警告和错误信息 |
-vv | 打印客户端的请求和返回信息 |
-h | 打印帮助信息 |
-i | 打印memcached和libevent的版权信息 |
2-4 window 下 memcache 简单操作
1. telnet操作memcache
确保本地已经安装 telnet
安装步骤:
控制面板==>程序==>启用或关闭windows功能==>Telnet客户端
打开 cmd ,使用telnet 连接至memcache
telnet 127.0.0.1 11211
2. 数据存储命令
a. set 命令 格式:set key flag expiretime bytes
说明:有则改无则增
举个栗子
set username 0 0 4
注:最后一位是字节,那么在输入存如内容时,大小必须是2个字节,否则存储不成功。
b. add 命令 格式:add key flag expiretime bytes
说明:add与set一致,区别是不能添加已经存在一个key为username的数据,否则不成功。
举个栗子
add username 0 0 4
数据修改命令
a. replace 命令 格式: replace key flag expiretime bytes
说明:replace与set一致,区别是只有数据存在时才能进行数据更新,如果replace一个不存在的key的数据,则replace不成功。
举个栗子
replace username 0 0 4
数据读取命令
a. get命令 格式: get key
说明:get空格key 可以获取指定key的数据。多个key可以用空格隔开
举个栗子
get username
数据删除命令 a. delete命令 格式:delete key
说明:删除已存在的键值和不存在的记录可以返回不同的结果。
举个栗子
delete username
b. 清空所有数据 flush_all [time]
举个栗子
flush_all[60]
注: time参数是指是所有缓存失效,并在time秒内限制使用删除的key
其他命令
a. 增减: incr/decr key value 举个栗子
incr age 1
decr age 1
b. 服务器状态命令 stats
名称 | 解释 |
---|---|
STAT pid 22459 | 进程ID |
STAT uptime 1027046 | 服务器运行秒数 |
STAT time 1273043062 | 服务器当前unix时间戳 |
STAT version 1.4.4 | 服务器版本 |
STAT pointer_size 64 | 操作系统字大小(64位) |
STAT total_connections 82 | 曾打开的连接总数 |
STAT cmd_get 54 | 执行get命令总数 |
STAT cmd_set 34 | 执行set命令总数 |
STAT cmd_flush | 指向flush_all命令总数 |
STAT get_hits 9 | get命中次数 |
STAT get_misses 45 | get未命中次数 |
STAT delete_misses 5 | delete未命中次数 |
STAT delete_hits 1 | delete命中次数 |
STAT accepting_conns 1 | 目前接受的链接数 |
STAT bytes 0 | 存储item字节数 |
STAT curr_items 0 | item个数 |
STAT evictions 0 | 为获取空间删除item的总数 |
名词解释
key是什么? (add/replace/set 的第一个参数)
- key是缓存名 memcached的一个重要特点就是key-value缓存 即键值对缓存. 每个缓存有一个独特的名字和存储空间.
- key是操作数据的唯一标识
- key可以250个字节以内,不能有空格和控制字节
flag有什么用? (add/replace/set 的第二个参数)
flag是”标志”的意思,可以用此参数来标志内容的类型 对于字符串,直接存5个字符即可, 对于array,则需要序列化.
Q:取出数据时,又如何处理呢?
A:字符串,取回直接用, 数组,则需要反序列化成数组.
提示:在memcache中可以忽略flag参数memcache自动识别
expire是啥(add/replace/set 的第三个参数)
说明:过期时间 可以为时间戳 也可以是秒数 默认是0 永久有效(其实并不是永久有效,下面会给大家说)
Q:expire以什么为单位?
A:秒为单位
Q:expire的秒数代表什么?
A:如果expire<=30*24*60*60,则代表自当前时间的偏移,即有效期在 time()+expire以内.
如果expire > 30 * 24 * 60 * 60 ,则直接代表时间戳.
即,在1970年+expire秒以内有效.
第三章:Linux 平台下搭建 memcached 服务
3-1 编译安装 Memcached 服务
在 linux 编译,需要 gcc,make,cmake,autoconf,libtool 等工具,所以请先装. 【Linux 系统需联网】,命令安装
# yum install gcc make cmake autoconf libtool
memcached 依赖于 libevent 库,因此我们需要先安装 libevent.
分别到 libevent.org 和 memcached.org 下载最新的 stable 版本(稳定版).
libevent 官网:http://libevent.org
下载地址(Github地址)
编译安装 libevent
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
tar zxvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local/libevent
make && make install
再编译安装 memcached
Memcached 官网:http://memcached.org/
编译 memcached 时要指定 libevent 的路径.
wget http://www.memcached.org/files/memcached-1.4.36.tar.gz
tar zxvf memcached-1.4.36.tar.gz
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
make && make install
memcached 的启动 从终端输入以下命令,启动 memcached。
# /usr/local/memcached/bin/memcached -p 11211 -m 64m -u root -vv
作为 daemon 后台启动时,只需 -d
# /usr/local/memcached/bin/memcached -p 11211 -m 64m -u root -d
这里使用的 memcached 启动选项的内容如下。
选项 | 说明 |
---|---|
-p | 使用的 TCP端口。默认为 11211 |
-m | 最大内存大小。默认为64M |
-vv | 用 very vrebose 模式启动,调试信息和错误输出到控制台 |
-d | 作为 daemon 在后台启动 |
上面四个是常用的启动选项,其他还有很多,通过
# /usr/local/memcached/bin/memcached -h
命令可以显示。许多选项可以改变 memcached 的各种行为,推荐读一读。
常出现问题一:
在虚拟机下练习编译,一个容易碰到的问题—虚拟机的时间不对, 导致的 gcc 编译过程中,检测时间通不过,一直处于编译过程.
解决方法:
# date -s \'yyyy-mm-dd hh:mm:ss\'
# clock -w # 把时间写入 cmos
常出现问题二:
[root@iZ2ze2mkw2q2od0ctv8jnfZ memcached]# bin/memcached
can\'t run as root without the -u switch
解释:没有指定- u开关不能作为根用户运行
3-2 Memcache 服务的安全
此时本地客户端Telnet或php程序就可以连接至线上Memcache,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵。
解决方案
1. 内网访问
把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,
Memcache的服务器上启动的时候就监听内网的IP地址和端口。
# memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
启动监听内网的127.0.0.1的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接
2. 设置防火墙
如若必可避免暴漏在外网,防火墙是简单有效的方式,那么可以考虑使用防火墙来过滤非法访问。
一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT
上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。
3-3 Linux 上编译 memcached 扩展
3-3-1 编译安装 libmemcached
安装基础依赖库
yum -y install gcc gcc-c++ libstdc++-devel
libmemcached 官网 http://libmemcached.org/libMemcached.html
编译安装
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar libmemcached-1.0.18.tar.gz
tar zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached
make && make install
3-3-2 编译安装 memcached
下载 Memcached 扩展包 下载地址:http://pecl.php.net/package/memcached
wget http://pecl.php.net/get/memcached-3.0.3.tgz
tar memcached-3.0.3.tgz
tar zxvf memcached-3.0.3.tgz
cd memcached-3.0.3
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached/ --disable-memcached-sasl
make && make install
如果看到如下结果,那么恭喜您。
[root@iZ2ze2mkw2q2od0ctv8jnfZ memcached-3.0.3]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/
打开自己环境中的 php.ini
,加入如下
# vim /usr/local/php/lib/php.ini
extension=memcached.so
打印 phpinfo()
,ctrl+f
搜索 memcached,看到如下
至此,你的PHP
已支持memcached
收工。
错误分析
configure: error: no, sasl.h is not available. Run configure with --disable-memcached-sasl to disable this check
按提示所说--disable-memcached-sasl
禁用该选项即可。
3-3 Memcache 存储SESSION
方法I: 在 php.ini 中全局设置
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
方法II: 应用中动态更改配置:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path","tcp://127.0.0.1:11211");
方法III: 项目目录下的 .htaccess
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"
6-1 Memcache 的监控
6-1-1 memcache.php
http://pecl.php.net/package/memcache
从 memcache-3.0.8.tgz 包中找到 memcache.php,拷贝至你的项目下,进行如下配置
define(\'ADMIN_USERNAME\',\'memcache\'); // Admin Username
define(\'ADMIN_PASSWORD\',\'password\'); // Admin Password
$MEMCACHE_SERVERS[] = \'mymemcache-server1:11211\'; // add more as an array
$MEMCACHE_SERVERS[] = \'mymemcache-server2:11211\'; // add more as an array
不用多说,相信你懂的,完成以上配置后,访问(本宝宝的访问地址):http://localhost/memcache.php
6-1-2 memcache-top
这个工具memcache-top是一个perl脚本,可以运行在term下。它能够像top一样显示各个memcached节点的状态变化,其中包括系统管理员最关心的几个指数,例如:缓存命中率、内存、使用率、读写QPS等。
运行前要确保memcache-top脚本具有可执行权限 chmod u+x *.sh ,然后使用./执行即可。
memcache-top 比较重要的几个参数包括:
-
–commands: 显示GETS/SETS命令的调用次数
-
–sleep: 刷新间隔,默认为3秒
-
–lifetime: 显示自memcached启动以来的累计统计值,默认关闭,即仅显示瞬时速率
6-1-3 memadmin
基于 PHP5 & JQuery 的 Memcached 管理监控工具
官方网址: http://www.junopen.com/memadmin/