memory+cache 内存缓存php
memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,目前被许多网站使用以提高网站的访问速度,尤为对于一些大型的、须要频繁访问数据库的网站访问速度提高效果十分显著 。这是一套开放源代码软件,以BSD license受权发布。【摘取自百度百科】mysql
官网:http://memcached.org/linux
分布式:多台Memcache服务器来管理数据的架构。c++
缓存系统:将用户查询的数据缓存到内存之中,方便下次直接从内存中获取。减小了磁盘IO的开销。算法
什么是nosql?(sql 关系型数据库)sql
答:MySQL 叫作关系型数据库(主要的特色是都是一个二维表结构(表中的行和列),表与表之间是由关系的)(oracle(Java)、db二、sqlserver)数据库
非关系型数据:就是不使用sql语句做为查询的数据库(保存数据的系统),而且没有严格意义上的二维表的概念。它的数据结构所有是一张巨大的hash表(key-value)vim
hash表好处: 时间复杂度是 0(1):随着数据的增长,查询时间不会存在数量级(1s)的变化。浏览器
hash表坏处: hash碰撞 不一样 key 对应同一个值缓存
key1 ===MD5(sql) |
Asion |
key2 |
12 |
key3 |
shenzhen |
key4 |
iphone |
在使用的时候,先从nosql数据库里面获取,有的话直接返回,没有的话就先从MySQL获取,而后缓存到memcache里面,下次直接从memcache里面返回。
1. MemcacheDB能够持久化保存数据。2. repcached也能够实现数据的持久化
注意:NoSQL是否可以取到MySQL(关系型数据库)?
答: nosql的存在永远不是为了取代MySQL(关系型数据),是关系型数据的一个补充。由于关系型数据库有它独特的地方(事务,存储过程)。
Nosql主要使用的场景:社交型网站(人人、校内、豆瓣)
课下了解:什么是C10K问题?C100K
答:c10k 表明的含义就是当网站的并发数达到 1w 时候网站的总体架构会所有的更新,就叫作c10k,目前已经被NoSQL数据库完美的解决。可是又有 c100k 的问题?
架构网站:
1.1 直接将memcached文件放置到某一文件夹下(千万不要使用中文命名的文件夹 | 空格)
1.2 在cmd下执行以下命令(不能关闭)可使用Ctrl+c 终止
memcache的端口 11211
1.3 查看是否启动(新开一个窗口),执行以下命令
# netstat -an
让selinux当即生效
2.1 环境准备
在Linux环境下,须要gcc、g-c++、make(makefile)、cmake、autoconfig(configure)、libtool等工具
在Linux下联网的状况下,使用以下命令
# yum install -y gcc make cmake autoconfig libtool
-y 不须要使用确认交互式
2.2 编译安装memcached
memcached依赖于 libevent库,所以须要先安装,分别到各自的官网下载稳定版
libevetnt官网:http://libevent.org/
memcache官网:http://memcached.org/
先编译安装libevent,在编译安装memcached,同时在安装memcached须要指定libevent的安装路径
具体步骤:
上传
# ./configure --prefix=/usr/local/libevent && make && make install
b. 安装memcache,解压、编译、安装
# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent && make && make install
2.3 memcached的启动
# /usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody -vv
注意:此时memcached成功启动,但把信息输出到控制台。
若是想让memcached做为服务在后台启动,只须要加上-d选项(daemon 后台)
# /usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody -d
如何查看服务器是否正常启动?
# ps axu | grep memcached
若是须要查看参数信息,使用 memcached -h 查看帮助:
memcached的客户端与服务器端的通讯很简单,基于文本的协议,相似http协议,能够直接使用Telnet来作交互
使用Telnet操做(quit退出)
# telent 服务器的IP 11211
链接以后 使用 ctrl + ] 打开Telnet的回显
2. 基本命令:
学习memcache的增删改查命令:
add key flag expire length
key: 名称
flag: 1 memcache按照字符串的方式保存
expire:过时时间,memcache时间
length:数据长度(B)
※add 增长
# add name 1 0 2 # 在memcache服务器上添加一个key为的name值 长度为2个字节,有效期长期有效
如何理解expire
设置缓存的有效期,有三种格式
最近最少使用原则
※delete 删除
# delete key
※replace 替换
# replace key flag expire length
※get 获取
# get key
※set 若是数据有 replace ,没有则 add
# set key flag expire length
name存在:
age不存在:
※incr 增长
# incr age NUMBER
※decr 减小
# decr age NUMBER
※stats 统计memcache服务器信息
# stats
※flush_all 清空全部数据
# flush_all
beta :测试版:通常都有一些小bug,可是须要用户去使用发现,若是有问题,能够给官方反馈。而后在作修复
alpha:内部测试版:内部在开发的时候,使用的版本,通常这个版本bug众多。可是这个版本每每有新的功能加入。(通常也是新公司才试试)alpha版本有一些补偿。
stable:稳定版:基本无bug,可以稳定的运行。
ftp使用的注意事项:
# cls
# cd
# vim .bashrc
Linux下载末行模式下
# :x 小写 退出 wq
linux在编辑模式下
# Z 大写
# /usr/local/php/bin/phpize 绝对路径phpize
d. 利用上面生成的configure文件,收集系统信息 不须要指定安装路径
# ./configure --with-php-config=/usr/local/php/bin/php-config 告诉它如何去找php配置文件
e. 执行编译、安装
# make && make install
注意:能够查看上述命令执行完成以后的结构
# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
注意:在Linux下,如何查看php.ini配置文件的位置?
解决:phpinfo();
注意:在Linux下,修改配置文件以前,必定要备份
php.ini-backup-2016-1-12
注意:.so是什么文件?
.so是Linux下的共享对象,类型Windows下的.dll文件
注意:Linux下,关闭一个服务 可使用
# pkill -9 httpd
# ps aux | grep httpd
#ps uax | grep httpd
将上面生成的地址增长到php.ini配置文件,以下
extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
extension=memcacahe.so
创建一个test.php文件,测试php是否有memcache的一个模块
php操做memcache,保存并获取值
注意:Memcache最大的value也只能是1M的空间。
注意:内存碎片化永远都存在,只是哪种方式可使得内存碎片最小。
1. 什么是内存碎片化?
在使用这种内存缓存系统的时候,因为不断的申请,释放,就会造成一些很小的内存片断,没法被利用,这种现象就叫作,内存的碎片化。这个小红块就是操做系统没法使用的空间。
memcache利用slab allocator的方式来管理(每一个slab class大小为1M)
最小的单元叫作 chunk(小块):存放数据的仓库
多个小单元组成一个chunks:多个小块组成(全部的小块的大小所有一致)
每一个 slab class的大小为1M
注意:若是 122Bytes的slab装满了,如今有一个100Bytes的数据来了,存到哪里去?
答:确定不会存在144,仍是存在122这个chunk里面,利用LRU算法来实现数据存储。
memcached在启动的时候,会按照必定的大小来组织slab class,能够经过-f 来指定
默认是1.25,相邻chunk之间的比值就是增长因子。能够根据本身网站的业务调整缓存因子的大小。
是由于每一个业务不同,所须要的最小的chunk是不同的。这个参数使得咱们的系统变得更加适应本身的业务,由于数据能够本身设定大小。
memcached内部不会监视记录是否过时,而是在get时查看记录的时间戳,检查记录是否过时。这种行为被称为lazy(惰性)expiration。所以,好处是memcached不会在过时监视上耗费CPU时间。
好比:有 set(name, asion, 0, 3600) 过了3600秒就失效,失效后,并不会自动删除,只有当get查询时,检测是否过时,若是过时则删除。
例如 # add name 1 8 2 当8s后,是失效,仍是不存在?经过stats分析
分析:是失效你,而不是不存在,只有在下一次去获取时候,memcache才会去检测它是否过时,过时了就删除
memcached会优先使用已超时的记录的空间,但即便如此,也会发生追加新记录时空间不足的状况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。
顾名思义,这是删除"最近最少使用"的记录的机制。所以,当memcached的内存空间不足时(没法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空
间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
当mecache里面的数据空间(默认是64M)已经占满了,再继续存储数据可否存储呢?
答:能存储,要删除过时的数据,若是都没有过时,则删除最不活跃的数据,腾出空间给后面添加数据。
例如:以122Bytes的slab举例,当数据装满后,若是来了一个100Bytes数据,如何处理?(即便永久有效,也会被踢)
分析:内存的管理 LRU算法 、FIFO算法
注意:在vim下若是输入了 ctrl+s 可使用 ctrl+q 退出
-p 监听的端口
-l 链接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
注意:若是系统是32位的,则最大限制为2G,若是系统是64位,则无限制。
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时链接数,默认是1024
-f 块大小增加因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
-v 输出警告和错误信息
-vv 打印客户端的请求和返回信息
-i 打印memcached和libevent的版权信息
保存:1. 文件 2. mysql
问题:若是一个文件夹下session文件过多,检索变慢,如何处理?
答:分层处理
使用Memcache来保存,Memcache使用分布式来保存(拿多台Memcache作存储)
使用memcache保存session
1. 修改php.ini文件,配置信息以下
session.save_handler = memcache #表明使用memcache保存session
session.save_path ="tcp://127.0.0.1:11211" # 指定memcache服务器的地址和端口
1. 开启session,保存session
什么是分布式?
因为单台memcache的服务能力有限,可使用多台memcache来提供缓存的功能,这种架构就叫作memcache的分布式缓(集群)存系统
如何实现?
能够这样理解,如何将数据分散答各台Memcache服务器上。
在客户端实现分布式,在数据保存以前,根据必定的算法,将数据保存到那台memcache服务器上,在获取数据的时候,按照前面相同的算法去对应的memcache服务器上获取数据
分布式算法
将key的值对服务器的台数取余,而后将对应的value值保存到对应的余数的那台memcache服务器上,通常这个hash函数 crc32( key ) % 3
crc32()这个函数可使得一个字符串变成一个32位的整数
坏处:当某一台服务器宕机或者须要增长一台服务器的时候,这个时候缓存数据基本所有失效,由于除数变了。 不严格的公式, 命中率 = 取到数据/总数 1/N N表明服务器的台数
引起出来的问题:当memcache宕机以后,缓存数据失效,这个时候MySQL的压力会骤增,
这个时候,MySQL会宕机,而后在重启MySQL,MySQL会在短时期内再次宕机,而后,稍微延迟一点(缓存已经从新创建了一部分),又宕机。随着时间的慢慢推移,MySQL基本上趋于稳定,缓存系统成功创建。由于缓存数据不存在,全部的请求所有要转向MySQL来提供,这种现象就叫作memcache的雪崩现象。
概图:
注意:只要是memcache宕机,就必定会有数据的丢失。可是要想办法让数据丢失的最少,使用一致性hash,即便有一台服务器宕机,也只是影响一台服务器上的数据。
虚拟节点:分担任务
雪崩形成的缘由?
解决方案:一致性hash算法
解决方案:缓存时间设置成一个范围内的随机时间(3-9小时)
因为某个memcache节点的缓存数据失效,致使其余memcache节点的缓存命中率降低,缓存中缺失的数据会去MySQL数据库中查询,短时期内,形成了MySQL服务器压力巨大,形成宕机,就叫作缓存雪崩现象。
当重启MySQL以后,短时间内再次宕机,但缓存数据已经创建了一部分,在MySQL反复屡次启动以后,缓存所有重建完毕,MySQL再也不宕机趋于稳定。
解决方案:把缓存的时间设置成一个范围内的随机值(3-9小时),这样就在不一样的时间段失效,把重建的工做分担到不一样的时间上。
答:
答:
因为memcache的自己设计就是极为简洁的,根本没有设置权限方面的限制。为何不设置权限? 只提供缓存功能,为了精简
192.168.1.221 ---224
3. 当使用文件保存session文件时候,若是文件过多,如何处理?
通常来讲,超过65535个session文件的时候,这个时候session的获取就会变得异常缓慢,意味php代码执行很慢,如何解决?
答:
分层处理: 一个文件夹下创建A-Z开头的文件夹 而后A_Z在创建
使用memcache处理: 单台memcache处理能力有限,就使用分布式memcache来处理
答:负载均衡集群提供了高可用的能力,若是某一台宕机以后,仍是能够提供正常的服务,只是服务提供的有些吃力而已。
由于负载均衡集群不提供keepalive的机制。监控机制
在项目中如何使用Memcache?
Memcache存在的意义就是缓存数据,减轻MySQL的压力。
答:
extension_dir='上面生成的目录'
extension='NAME.so'