内存缓存软件 (内存比磁盘快)php
分为服务端和客户端 html
服务端 memcached前端
客户端memcachemysql
诞生的缘由。linux
2003年诞生了memcachednginx
web1.0 2005之前 企业提供内容为主。web
web2.0 2005-2012 企业只提供平台,用户参与上传和下载内容。算法
目标:sql
解决高并发访问的问题,减轻传统数据库mysql的压力。数据库
不关注数据可靠性,只关心高并发读写。
差别化发展。
企业应用场景:
1、数据库前端的缓存
读数据: 开发程序从逻辑上,首先访问memcached。若是memcached没有所须要的数据在访问mysql。
写数据: 若是在写数据库的同时,把数据库写入到memcached。或者写入mysql的同时,由mysyl复制到memcached。
linux运维角色,搭建memcached服务,提供服务(使用的信息问开发)
2、集群后端的共享会话服务session
session门票。若是在网站内有了这个门票,就能够浏览任意界面。
解决共享会话的方案:
1)nginx的调度算法IP_hash(缺点:致使负载不均衡)
2)经过memcached作会话共享。
3)cookies(放在用户浏览器端)优势:能够大并发。缺点:容易篡改,不安全。
搭建memcached服务
1、libevent(epoll模型,libevent做为事件通知机制)
yum install libevent-devel -y
rpm -qa libevent-devel
2、下载memcached
yum install memcached -y
rpm -qa memcached
3、启动服务并检查
[root@db01 ~]# memcached -m 16m -c 2048 -uroot -p 11211 -d
-m 指定内存 -c 多少访问链接 -u 指定用户 -p 指定端口号 -d 以守护进程的方式
[root@db01 ~]# netstat -lntp|grep memcache
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 4026/memcached
tcp 0 0 :::11211 :::* LISTEN 4026/memcached
MySQL数据库管理 |
Memcached管理 |
MySQL的insert语句 |
Memcached的set命令 |
MySQL的select语句 |
Memcached的get命令 |
MySQL的delete语句 |
Memcached的delete命令 |
操做Memcached的相关命令的语法
如下为操做Memcached的相关命令基本语法:
set key 0 0 0
<command name> <key> <flags> <exptime> <bytes>\r\n
<datablock>\r\n
<status>\r\n
命令 |
说明 |
command name |
set不管如何都进行写入数据,会覆盖老数据 add只有对应数据不存在时才添加数据 repalce只有数据存在时进行替换数据 append日后追加:append<key>datablock<status>? prepend往前追加:prepend<key>datablock<status> cas按版本号更改 |
key |
普通字符串,要求小于250个字符,不包含空格和控制字符 |
flags |
客户端用来标识数据格式的数值,如json、xml、压缩等 |
exptime |
存活时间s,0为永远,小于30天,60*60*24*30为秒数 大于30天为unixtime |
bytes |
byte字节数,不包含\r\n,根据长度截取存/取的字符串,能够是0,即存空串 |
datablock |
文本行,以\r\n结尾,固然能够包含\r或\n |
status |
STORED/NOT_FOUND |
下载telnet 和 nc包
yum install telnet nc -y
telnet方式
存进去 拿出来 删除掉
[root@web03 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set k1 0 0 6
oldboy
STORED
get k1
VALUE k1 0 6
oldboy
END
delete k1
DELETED
用nc方式
[root@web03 ~]# printf "set key008 0 06\r\noldboy\r\n"|nc 127.0.0.1 11211
STORED
用printf方式查看
printf "get key008\r\n"|nc127.0.0.1 11211
删除
printf "delete key008\r\n"|nc127.0.0.1 11211
三种 写入 读取删除
[root@web03 ~]#printf "set key008 0 0 6\r\noldboy\r\n"|nc 127.0.0.1 11211
STORED
[root@web03 ~]# printf"get key008\r\n"|nc 127.0.0.1 11211
VALUE key008 0 6
oldboy
END
[root@web03 ~]# printf"delete key008\r\n"|nc 127.0.0.1 11211
DELETED
memcached查看帮助
memcached -h
Memcached启动命令相关参数
命令参数 |
说明 |
进程与链接设置: |
|
-d |
以守护进程(daemon)方式运行服务 |
-u |
指定运行Memcached的用户,若是当前用户为root,须要使用此参数指定用户 |
-l |
指定Memcached进程监听的服务器IP地址,能够不设置此参数 |
-p(小写) |
指定Memcached服务监听TCP端口号,默认为11211 |
-P(大写) |
设置保存Memcached的pod文件($$),保存PID到指定文件 |
内存相关设置 |
|
-m |
指定Memcached服务能够缓存数据的最大内存,默认为64MB |
-M |
Memcached服务内存不够时禁止LRU,若是内存满了会报错 |
-f |
chunk size增加因予,默认1.25 |
-L |
启用大内存页,能够下降内存浪费,改进性能 |
并发链接设置 |
|
-c |
最大的并发链接数,默认是1024 |
-t |
线程数,默认4.因为Memcached采用的是NIO,因此太多线程用处不大 |
-R |
每一个event最大请求数,默认20 |
-C |
禁用CAS(能够禁止版本计数,减小开销) |
调试参数 |
|
-v |
打印较少的errors/warnings |
-vv |
打印很是多调试信息和错误输出到控制台,也打印客户端命令及响应 |
-vvv |
打印极多的调试信息和错误输出,也打印内部状态转变 |
php所在服务器上安装memcached客户端,程序才能访问memcached
把memcache-2.2.5.tgz数据包拉到/home/oldboy/tools/
而后进行编译安装
tar zxf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config
make
make install
cd ../
[root@web02 tools]# ll/application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
total 256
-rwxr-xr-x 1 root root 258064 Jun 9 14:44 memcache.so
echo '<?php phpinfo(); ?>' >/application/nginx/html/blog/a.php
[root@web02 php]# cat /application/nginx/html/blog/a.php
<?php
phpinfo();
?>
经过页面:blog.etiantian.org/a.php检查mc的配置状况。
配置:
vim /application/php/lib/php.ini
extension_dir ="/application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/"
extension = memcache.so
重启Php
pkill php-fpm
/application/php/sbin/php-fpm
再次经过页面:blog.etiantian.org/a.php检查mc的配置状况。ctrl + F
搜索memcache页面内容,若是有结果,表示成功。
管理memcachedweb端
把memadmin-1.0.12.tar.gz包拉进 /home/oldboy/tools/
tar zxvfC memadmin-1.0.12.tar.gz /application/nginx/html/blog/
进行指定解压
Memcached状态信息详细说明
参数 |
值 |
描述 |
实际做用 |
pid |
28123 |
memcache服务进程ID |
查看服务信息 |
uptime |
20063728 |
服务已运行秒数 |
|
time |
1440577412 |
服务当前Unix时间戳 |
|
version |
1.4.4 |
Memcache版本 |
|
libevent |
1.4.13-stable |
libevent版本 |
|
pointer_size |
64 |
操做系统指针大小 |
|
rusage_user |
645314.961214 |
进程累计用户时间 |
分析占用CPU的状况 |
rusage_system |
1134305.468357 |
进程累计系统时间 |
|
cuur_connections |
1361 |
当前链接数 |
分析链接数状况 |
total_connections |
18299935 |
Memcached运行以来链接总数 |
|
connection_structures |
12455 |
Memcached分配的链接结构数量 |
|
reserved_fds |
20 |
内部使用的FD数 |
|
cmd_get |
60424570825 |
get命令请求次数 |
分析命令率状况 |
get_hits |
58105159197 |
get命令命中次数 |
|
get_misses |
2319411628 |
get命令未命中次数 |
|
curr_items |
24628253 |
当前的对象数目 |
分析对象数LRU频率 |
total_items |
854196259 |
当前存储占用的字节数 |
|
evictions |
7509 |
LRU释放的对象数目 |
如今的Memcached是利用Slab Allocation机制来分配和管理内存的,过程以下:
1)提早将大内存分配大小为1MB的若干个slab,而后针对每一个slab再进行小对象填充,这个小对象称为chunk,避免大量重复的初始化和清理,减轻了内存管理器的负担。
Slab Allocation 内存分配的原理是按照预先规定的大小,将分配给Memcached服务的内存预先分割成特定长度的内存块(chunk),再把尺寸相同的内存块(chunk)分红组(chunks slab class),这些内存块不会释放,能够重复利用。
2)新增数据对象存储说明。
Memcached服务器中保存着slab内空闲chunk的列表,它会根据该列表选择chunk,而后将数据缓存于其中。当有数据存入时,Memcached根据接收到的数据大小,选择最合适数据大小的slab,分配一个能存下这个数据的最小内存块(chunk)。例如:有100字节的一个数据,就会被分配存入下面的112字节的一个内存块中,这样会有12字节被浪费掉,这部分空间就不能被使用了,这也是SlabAllocator机制的一个缺点。
须要被缓存的数据以key/value键值对的形式保存在服务器端