Memcached缓存介绍
Memcached是什么?
是一个开源的,高性能,高并发的分布式缓存系统(存内存的缓存系统)
软件名称:Memcached-1.4.24.tar.gz
客户端名称:Memcache-2.25.tar.gz
Memcached的作用:
通过自身内存中缓存关系型数据库的查询结果,减少数据库自身被访问的次数,以提高动态web应用的速度,提高网站架构的并发能力和扩展性
1:电商的商品分类功能不会经常变动,可以实现放入memcache里,然后在对外进行数据访问,这个叫“数据预热”
2:作为集群sesson会话共享存储
特性:
- 协议简单,采用文本的协议,telnet/nc等命令就能操作memcached
- 支持epoll/kqueue异步I/O模型,使用libevent作为事件处理机制
- key/value键值数据类型
- 全内存缓存,效率高
- 支持分布式集群(通过一致性hash算法)
安装:
#检查是否安装
rpm -qa libevent libevent-devel nc telnet
#安装管理工具及依赖
yum install libevent libevent-devel nc telnet -y
#安装memcache
yum install memcached -y
#查看路径
which memcached
/usr/bin/memcached
#启动
memcached -m 16m -p 11211 -d -u root -c 8192
#常用参数
-m:使用多大内存(默认64,最大1024) -l 监听地址
-p:端口(默认11211) -P PID保存的文件
-d:后台运行 -M 内存不够时禁止LRU(清除数据),满了报错
-u :用户 -n key+value+flags分配的最小内存空间,默认48字节
-c:并发连接数(默认1024) -f chunk size增长因子,默认1.25
#查看端口
lsof -i:11211
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
memcached 2201 root 26u IPv4 12720 0t0 TCP *:memcache (LISTEN)
memcached 2201 root 27u IPv6 12721 0t0 TCP *:memcache (LISTEN)
memcached 2201 root 28u IPv4 12724 0t0 UDP *:memcache
memcached 2201 root 29u IPv6 12725 0t0 UDP *:memcache
#启用多实例(增加一个端口就行了)
memcached -m 16m -p 11212 -d -u root -c 8192
#语法
set key1 0 0 6
command key flags exptime(过期时间,0不过期) 写入内容value大小字节数\r\n
插入 set
查询 get
删除 delete
更新替换 replace(数据存在才会替换)
#进入memcache
telnet 127.0.0.1 11211
#写入 取出 删除 数据
set user01 0 0 7 #7字符要与下面存的内容相同
daxian1 #7个字符
STORED #成功
get user01 #通过key 取出数值
VALUE user01 0 7 #取出
daxian1 #显示
delete user01 #删除
quit #退出
#nc的用法
printf "set key1 0 0 6\r\ndaxian\r\n"|nc 127.0.0.1 11211
#取值
printf "get key1 \r\n"|nc 127.0.0.1 11211
VALUE key1 0 6
daxian
END
#删除
printf "delete key1 \r\n"|nc 127.0.0.1 11211
==============================实战=======================
准备好lnmp环境
至少能出现phpinfo
下载PHP扩展插件memcache插件
http://pecl.php.net/package/memcache
cd /home/daxian/tools/
wget http://pecl.php.net/get/memcache-2.2.7.tgz
tar xf memcache-2.2.7.tgz
cd memcache-2.2.7
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config
make && make install
Installing shared extensions: /application/php5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
vim /application/php/lib/php.ini
结尾添加
extension = memcache.so
重启php
#检查php语法
/application/php/sbin/php-fpm -t
[02-Apr-2018 10:19:50] NOTICE: configuration file /application/php5.5.32/etc/php-fpm.conf test is successful
pkill php
/application/php/sbin/php-fpm
刷新phpinfo 就能看见了
可以测试了
vim /application/nginx/html/blog/mem_test.php
<?php
$memcache = new Memcache;
$memcache->connect('192.168.70.121', 11211) or die ("Could not connect Mc server");
$memcache->set('key','daxian hello');
$get= $memcache->get('key');
echo $get;
?>
访问
http://blog.daxian.com/mem_test.php
web就可以访问memcahce
memcache服务器也能查询到
[root@memcache ~]# printf "get key\r\n"|nc 127.0.0.1 11211
VALUE key 0 12
daxian hello
END
====================memcache内存管理======================
slab内存管理机制(默认1M)
slab 动态创建实际内存区,分配给slab的内存空间,默认是1m,分配给slab之后根据slab的大小切分成chunk,默认48字节,大于1M会忽略
chunk 数据区块,固定大小 初始化48字节,
为了避免内存的浪费,预先计算出应用存入得数据大小,或吧同一个业务的数据类型存入到一个memcached服务器中
或者 在启动memecache时,指定“-f”参数,在一定程度上控制内存之间的大小差异
-f 默认值(1.25)
解决办法:规划slab大小=chunk大小*n整数倍
调整chunk大小
memcached -f 2 -vvv -u root
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 192 perslab 5461
slab class 3: chunk size 384 perslab 2730
slab class 4: chunk size 768 perslab 1365
slab class 5: chunk size 1536 perslab 682
slab class 6: chunk size 3072 perslab 341
slab class 7: chunk size 6144 perslab 170
slab class 8: chunk size 12288 perslab 85
slab class 9: chunk size 24576 perslab 42
slab class 10: chunk size 49152 perslab 21
slab class 11: chunk size 98304 perslab 10
slab class 12: chunk size 196608 perslab 5
slab class 13: chunk size 393216 perslab 2
slab class 14: chunk size 1048576 perslab 1
调整成1.25
memcached -f 1.25 -vvv -u root
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 4: chunk size 192 perslab 5461
slab class 5: chunk size 240 perslab 4369
slab class 6: chunk size 304 perslab 3449
slab class 7: chunk size 384 perslab 2730
slab class 8: chunk size 480 perslab 2184
slab class 9: chunk size 600 perslab 1747
slab class 10: chunk size 752 perslab 1394
slab class 11: chunk size 944 perslab 1110
slab class 12: chunk size 1184 perslab 885
slab class 13: chunk size 1480 perslab 708
slab class 14: chunk size 1856 perslab 564
slab class 15: chunk size 2320 perslab 451
slab class 16: chunk size 2904 perslab 361
chunk size 96 perslab 10922
算法 96 * 10922
echo 96 * 10922/1024|bc
都是接近1M
==========================状态================
telnet 192.168.70.121 11211
stats
STAT pid 2201 #pid
STAT uptime 242312 #服务已运行描述
STAT time 1522640902 #服务当前时间
STAT version 1.4.4 #版本号
STAT pointer_size 64 #操作系统指针大小
STAT rusage_user 5.462169 #进程累积用户
STAT rusage_system 4.229357 #进程累积系统时间
STAT curr_connections 10 #当前连接数
STAT total_connections 18 #总的连接
STAT connection_structures 11 #分配的连接结构树
STAT cmd_get 5 #get请求数
STAT cmd_set 3 #set请求数
STAT cmd_flush 0 #flush请求数
STAT get_hits 4 #命中
STAT get_misses 1 #命中miss 百分比 命中/命中+miss
STAT delete_misses 1 # delete未命中数
STAT delete_hits 2 #delete 命中次数
STAT incr_misses 0 #incr未命中数
STAT incr_hits 0 # incr命中数
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0 #认证命令处理次数
STAT auth_errors 0 #认证失败处理次数
STAT bytes_read 232 #读取总次数
STAT bytes_written 238 #发送总字节数
STAT limit_maxbytes 16777216 #分配的内存总大小
STAT accepting_conns 1 #接收新的连接
STAT listen_disabled_num 0 #失效监听数
STAT threads 4 #当前线程数
STAT conn_yields 0 #连接操作主动放弃数目
STAT bytes 81 #已经过期但未获取的对象数目
STAT curr_items 1 #已驱逐但未获取的对象数目
STAT total_items 3 #当前存储占用的字节数
STAT evictions 0 #LRU释放的对象数
stats memcache各种信息
stats settings 查看设置信息,例如线程数
stat slabs 查看slabs相关状况,chunksize长度
stats items 查看items相关情况
stats sizes 查看item个数和大小
stats reset 清理统计数
或者使用memadmin,第三方php写的,连接memcache
wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
解压缩复制到 站点目录下即可
cp memadmin /application/nginx/html/blog/
访问网站即可
用户名密码admin
============================memcache 会话共享====================
修改php.ini 中session的类型和路径
session.save_handler = memcache
session.save_path = "tcp:/192.168.70.121:11211"
重启PHP
可以找一个bbs 搭建测试一下