Memcached缓存介绍

Memcached是什么?

    是一个开源的,高性能,高并发的分布式缓存系统(存内存的缓存系统)

软件名称:Memcached-1.4.24.tar.gz

客户端名称:Memcache-2.25.tar.gz

Memcached的作用:

    通过自身内存中缓存关系型数据库的查询结果,减少数据库自身被访问的次数,以提高动态web应用的速度,提高网站架构的并发能力和扩展性

              1:电商的商品分类功能不会经常变动,可以实现放入memcache里,然后在对外进行数据访问,这个叫“数据预热”

              2:作为集群sesson会话共享存储

特性

  1.     协议简单,采用文本的协议,telnet/nc等命令就能操作memcached
  2.               支持epoll/kqueue异步I/O模型,使用libevent作为事件处理机制
  3.     key/value键值数据类型
  4.     全内存缓存,效率高
  5.              支持分布式集群(通过一致性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大小字节数

插入  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 daxian "|nc 127.0.0.1 11211

#取值

printf "get key1 "|nc 127.0.0.1 11211
VALUE key1 0 6
daxian
END

#删除

printf "delete key1 "|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 "|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 搭建测试一下

原文地址:https://www.cnblogs.com/sky00747/p/8677526.html