内存缓存软件 (内存比磁盘快)
分为服务端和客户端
服务端 memcached
客户端memcache
诞生的原因。
2003年诞生了memcached
web1.0 2005以前 企业提供内容为主。
web2.0 2005-2012 企业只提供平台,用户参与上传和下载内容。
目标:
解决高并发访问的问题,减轻传统数据库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键值对的形式保存在服务器端
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。