Memcache
Memcache分布式缓存系统
Memcache简介
1. 缘起
在数据驱动的web开发中,经常要重复从数据库中取出相同的数据, 这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。 但是Web中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活。 此时Memcached或许是你想要的。最新版本:1.6.6
2. Memcached是什么?
Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
3. Memcached能缓存什么?
通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。各种数据都是以字符串的方式存放的。
4. Memcached快么?
非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接, 使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表,因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1)。 Danga Interactive为提升Danga Interactive的速度研发了Memcached。
5. Memcached的特点
Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候, 磁盘开销和阻塞的发生。
缓存数据:
- 在内存中缓存数据
- 数据形态以key->value结构
- 安全性不佳,但有应对方法
Memcache安装
1. Windows安装操作
1.1 在网上下载memcached-1.2.1-win32.zip。解压放某个盘下面,比如在D:\memcached
1.2 在终端(cmd)下:(管理员权限打开CMD!!!!!)
D:\>memcached.exe -d install 安装
D:\>memcached.exe -d uninstall 卸载
D:\>memcached.exe -d start 启动
D:\>memcached.exe -d stop 停止
memcached.exe -h 获取所有帮助
1.3 在启动之后连接: D:\>telnet 127.0.0.1 11211
--连接memcache端口11211 使用quit退出。
如果没有telnet工具请在“windows功能”中选择开启“telnet客户端”
1.4 其他命令参数:
启动Memcache 常用参数
-p <num> 设置端口号(默认不设置为: 11211)
-U <num> UDP监听端口(默认: 11211, 0 时关闭)
-l <ip_addr> 绑定地址(默认:所有都允许,无论内外网或者本机更换IP,
有安全隐患,若设置为127.0.0.1就只能本机访问)
-d 独立进程运行
... -d start 启动memcached服务
... -d restart 重起memcached服务
... -d stop|shutdown 关闭正在运行的memcached服务
... -d install 安装memcached服务
... -d uninstall 卸载memcached服务
-u <username> 绑定使用指定用于运行进程<username>
-m <num> 允许最大内存用量,单位M (默认: 64 MB)
-P <file> 将PID写入文件<file>,可以使得后边进行快速进程终止, 需要与-d 一起使用
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
1.5 windows的php扩展
php扩展目录 extension_dir
php_memcache.dll放置到php扩展目录ext下
php配置文件修改
extension=php_memcache.dll,
重启服务
2. Linux安装操作(根据当前环境等匹配安装各个包!)
2.1 安装memcached的底层功能依赖包libevent
tar -xf libevent-release-1.4.15-stable.tar.gz
cd libevent-release-1.4.15-stable
./autogen.sh
./configure --prefix=/usr
make && make install
2.2 安装memcached服务
tar -xf memcached-1.4.36.tar.gz 解压memcached
cd memcached-1.4.36 进入 memcached目录
./configure --prefix=/usr/local/memcached 配置
make && make install 编译与安装
useradd memcache 添加运行用户
2.3 运行memcached服务
/usr/local/memcached/bin/memcached –u memcache &
2.4 客户端访问(注意格式,错了重打)
telnet 127.0.0.1 11211
stats
set
get
……
2.5 写入自启动和关闭进程
vim /etc/rc.local
/usr/local/memcached/bin/memcached –u memcache &
pkill memcached
2.6 安装php_memcache扩展
unzip pecl-memcache-php7.zip
cd pecl-memcache-php7
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
修改 php.ini 后重启apache即可生效
extension="memcache.so";
2.7 安装libmemcached(版本匹配不能超过php_memcached)
tar -xf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure && make && make install
2.8 安装php_memcached扩展
tar -xf memcached-3.0.3.tgz
cd memcached=3.0.3
修改文件
vim php_libmemcached.h
/* this is the version(s) we support */
21 #include </usr/local/include/libmemcached/memcached.h>
修改结束
/usr/local/php/bin/phpize
./configure --disable-memcached-sasl --with-php-config=/usr/local/php/bin/php-config
make && make install
修改 php.ini 后重启apache即可生效
extension="memcached.so";
Memcache客户端(Telnet)相关操作
stats 查看状态
STAT pid 1552 服务进程的进程ID
STAT uptime 3792 服务从启动到当前所经过的时间,单位是秒。
STAT time 1262517674 服务器所在主机当前系统的时间,单位是秒。
STAT version 1.2.6 组件的版本。这里是我当前使用的1.2.6。
STAT pointer_size 32 服务器所在主机操作系统的指针大小,一般为32或64.
STAT curr_items 1 表示存放当前的所有缓存对象的数量。不包括已经从缓存中删除的对象。
STAT total_items 2 表示从启动到当前,系统存储过的所有对象数量,包括已经删除的对象。
STAT bytes 593 表示系统存储缓存对象所使用的存储空间,单位为字节。
STAT curr_connections 2 表示当前系统打开的连接数。
STAT total_connections 28 表示从memcached服务启动到当前时间,系统打开过的连接的总数。
set 写入缓存
set 键名 标记 有效时间 数据的长度
set love 10 0 10
i love you
键名
最大不能超过250个字符
标记
是一个16位的无符号的整数,在客户端get数据时返回
有效时间
单位为秒
数据长度
单位是字节
数据的值
最大不能超过1024kb
get 获取缓存
get 键名
get love
delete 删除缓存
delete 键名
delete love
flush_all清空所有缓存
其它常用命令
存储:
set add replace 格式同set
获取:
get 可一次获取多个
其它:
stats items 命令用于显示各个 slab 中 item 的数目和存储时长,配合使用可以查看所有 key
> stats items // 这条是命令
STAT items:7:number 1
STAT items:7:age 188
END
> stats cachedump 7 0 // 这条是命令
ITEM Sess_sidsvpc1473t1np08qnkvhf6j2 [183 b; 1394527347 s]
END
> version 查看版本
PHP操作Memcached服务
PHP开启Memcache模块
phpinfo检测是否开启
PHP Memcahe类
详见手册
PHP Memcahed类
详见手册
添加后支持laravel
Memcache存放Session
修改session配置,有几种方法
1、如果你能修改到服务器配置文件,那就打开打开php.ini
修改下面两项:
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
2、修改网站根目录下的.htaccess文件
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"
3、最常用的方法 在程序代码中修改(推荐)
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
注:使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:
"tcp://host:port?persistent=1&weight=2,tcp://host2:port2"
Memcache和MySQL配合存储Session
1、当用户登录时,将Session “set”到memcached,并写入数据库;
2、在Session中增加一个字段,标识Session最后写入数据库的时间;
3、每个页面加载的时候,优先从memcached读取Session,没有则从数据库读取;
4、每加载N页或者Y分钟后,再次将Session写入数据库;
Memcache缓存机制
Memcache在网站架构中的位置
Memcache与MySQL的配合
Memcache在脚本中的查询流程
1、先根据数据需求(SQL)取缓存,如果有返回数据,没有则根据需求查数据库
2、在数据库中查出的数据,并存入缓存。
Memcache的安全
我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程, 这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看, 重则服务器被入侵,因为Mecache是以root权限运行的, 况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的, 所以危险性是可以预见的。
为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。
内网访问
最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。 普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网, 那么就让Web服务器通过内网的网卡来访问Memcache服务器, 我们Memcache的服务器上启动的时候就监听内网的IP地址和端口, 内网间的访问能够有效阻止其他非法的访问。
设置防火墙
防火墙是简单有效的方式,如果却是两台服务器都是挂在网的, 并且需要通过外网IP来访问Memcache的话, 那么可以考虑使用防火墙或者代理程序来过滤非法访问。 一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问, 比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。
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
《缓存二三事》
缓存和数据库,更新缓存和淘汰缓存
set/replace delete set/add
在数据较少修改时可用 数据量大且需要逻辑运算
先操作谁?
拓展
《Memcache 内存分配策略和性能(使用)状态检查》
《如果Memcache集群中的服务器失效如何踢出》