附加memcache笔记.docx
- 文档编号:9690404
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:33
- 大小:972.26KB
附加memcache笔记.docx
《附加memcache笔记.docx》由会员分享,可在线阅读,更多相关《附加memcache笔记.docx(33页珍藏版)》请在冰点文库上搜索。
附加memcache笔记
大型网站优化-memcache技术
memory+cache内存缓存
memcache简介
memcache是一套分布式的高速缓存系统,由LiveJournal的BradFitzpatrick开发,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。
这是一套开放源代码软件,以BSDlicense授权发布。
【摘取自XX百科】
官网:
http:
//memcached.org/
分布式:
多台Memcache服务器来管理数据的架构。
缓存系统:
将用户查询的数据缓存到内存之中,方便下次直接从内存中获取。
减少了磁盘IO的开销。
什么是nosql?
(sql关系型数据库)
答:
MySQL叫做关系型数据库(主要的特点是都是一个二维表结构(表中的行和列),表与表之间是由关系的)(oracle(Java)、db2、sqlserver)
非关系型数据:
就是不使用sql语句作为查询的数据库(保存数据的系统),并且没有严格意义上的二维表的概念。
它的数据结构全部是一张巨大的hash表(key-value)
hash表好处:
时间复杂度是0
(1):
随着数据的增加,查询时间不会存在数量级(1s)的变化。
hash表坏处:
hash碰撞不同key对应同一个值
key1===MD5(sql)
asion
key2
12
key3
shenzhen
key4
iphone
1.使用原理
在使用的时候,先从nosql数据库里面获取,有的话直接返回,没有的话就先从MySQL获取,然后缓存到memcache里面,下次直接从memcache里面返回。
2.memcache与MySQL的区别
a.没有使用SQL语句
b.memcache没有MySQL中的表的概念,都是使用key-value来保存的
c.memcache的数据是保存到内存中的,断电即丢失(如何保存数据的持久性?
)
1.MemcacheDB可以持久化保存数据。
2.repcached也可以实现数据的持久化
注意:
NoSQL是否能够取到MySQL(关系型数据库)?
答:
nosql的存在永远不是为了取代MySQL(关系型数据),是关系型数据的一个补充。
因为关系型数据库有它独特的地方(事务,存储过程)。
Nosql主要使用的场景:
社交型网站(人人、校内、豆瓣)
课下了解:
什么是C10K问题?
C100K
答:
c10k代表的含义就是当网站的并发数达到1w时候网站的整体架构会全部的更新,就叫做c10k,目前已经被NoSQL数据库完美的解决。
但是又有c100k的问题?
架构网站:
memcache安装(使用端口11211)
1.Windows下安装
1.1直接将memcached文件放置到某一文件夹下(千万不要使用中文命名的文件夹|空格)
1.2在cmd下执行如下命令(不能关闭)可以使用Ctrl+c终止
memcache的端口11211
1.3查看是否启动(新开一个窗口),执行如下命令
#netstat-an
2.Linux下安装
a)putty--》远程连接Linux的一个客户端工具
i.注意:
一般连接不上(防火墙)
1.关闭防火墙
2.selinux没有关闭
让selinux立即生效
2.1环境准备
在Linux环境下,需要gcc、g-c++、make(makefile)、cmake、autoconfig(configure)、libtool等工具
在Linux下联网的情况下,使用如下命令
#yuminstall-ygccmakecmakeautoconfiglibtool
-y不需要使用确认交互式
2.2编译安装memcached
memcached依赖于libevent库,因此需要先安装,分别到各自的官网下载稳定版
libevetnt官网:
http:
//libevent.org/
memcache官网:
http:
//memcached.org/
先编译安装libevent,在编译安装memcached,同时在安装memcached需要指定libevent的安装路径
具体步骤:
上传
a.先下载libevent,解压,并安装(一般Linux下软件安装都是放在/usr/local/src目录下,安装的软件一般放在/usr/local/NAME)
#./configure--prefix=/usr/local/libevent&&make&&makeinstall
b.安装memcache,解压、编译、安装
#./configure--prefix=/usr/local/memcached--with-libevent=/usr/local/libevent&&make&&makeinstall
2.3memcached的启动
#/usr/local/memcached/bin/memcached-m64-p11211-unobody-vv
注意:
此时memcached成功启动,但把信息输出到控制台。
如果想让memcached作为服务在后台启动,只需要加上-d选项(daemon后台)
#/usr/local/memcached/bin/memcached-m64-p11211-unobody-d
如何查看服务器是否正常启动?
#psaxu|grepmemcached
如果需要查看参数信息,使用memcached-h查看帮助:
操作memcache
memcached的客户端与服务器端的通信很简单,基于文本的协议,类似http协议,可以直接使用Telnet来做交互
使用Telnet操作(quit退出)
#telent服务器的IP11211
1.Windows下
连接之后使用ctrl+]打开Telnet的回显
2.Linux下
2.基本命令:
学习memcache的增删改查命令:
addkeyflagexpirelength
key:
名称
flag:
1memcache按照字符串的方式保存
expire:
过期时间,memcache时间
length:
数据长度(B)
※add增加
#addname102#在memcache服务器上添加一个key为的name值长度为2个字节,有效期长期有效
如何理解expire
设置缓存的有效期,有三种格式
1.设置秒数,从设置开始,n秒后失效
2.时间戳,到指定时间戳后失效
3.设置为0,不自动失效(特别注意,不是永久有效。
a.在memcache安装时候,指定了一个最长的有效时间,默认是30天(源代码)b.可能不到30天,就会被挤出去)
最近最少使用原则
※delete删除
#deletekey
※replace替换
#replacekeyflagexpirelength
※get获取
#getkey
※set如果数据有replace,没有则add
#setkeyflagexpirelength
name存在:
age不存在:
※incr增加
#incrageNUMBER
※decr减少
#decrageNUMBER
※stats统计memcache服务器信息
#stats
※flush_all清空所有数据
#flush_all
使用php操作memcache
1.Windows下
a.到(
b.将该文件放到php的extension_dir对应的目录下
c.修改php.ini文件,加入extension=php_memcache.dll,引入该文件
d.重启Apache
2.Linux下(在Linux下如何为php开启一个扩展,说一下通用方案)
a.到(
beta:
测试版:
一般都有一些小bug,但是需要用户去使用发现,如果有问题,可以给官方反馈。
然后在做修复
alpha:
内部测试版:
内部在开发的时候,使用的版本,一般这个版本bug众多。
但是这个版本往往有新的功能加入。
(一般也是新公司才试试)alpha版本有一些补偿。
stable:
稳定版:
基本无bug,能够稳定的运行。
ftp使用的注意事项:
1.vsftpd是否正常的开启servicevsftpdstatus
2.一般都只能使用普通用户连接ftp(不能root来连接ftp)获取使用sudo
3.自己家目录的大小空间不够(上传文件成功,但是显示的大小为0)
4.防火墙是否关闭(iptables-F关闭)(iptables-L)
#cls
#cd
#vim.bashrc
Linux下载末行模式下
#:
x小写退出wq
linux在编辑模式下
#Z大写
b.一般下载到/usr/local/src目录下,解压,并进入该文件夹内
c.使用当前php的phpize命令创建configure文件(必须在扩展目录内)
#/usr/local/php/bin/phpize绝对路径phpize
d.利用上面生成的configure文件,收集系统信息不需要指定安装路径
#./configure--with-php-config=/usr/local/php/bin/php-config告诉它如何去找php配置文件
e.执行编译、安装
#make&&makeinstall
注意:
可以查看上述命令执行完成之后的结构
#ls/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
d.修改php.ini配置文件,重启Apache
注意:
在Linux下,如何查看php.ini配置文件的位置?
解决:
phpinfo();
注意:
在Linux下,修改配置文件之前,一定要备份
php.ini-backup-2016-1-12
注意:
.so是什么文件?
.so是Linux下的共享对象,类型Windows下的.dll文件
注意:
Linux下,关闭一个服务可以使用
#pkill-9httpd
#psaux|grephttpd
#psuax|grephttpd
将上面生成的地址增加到php.ini配置文件,如下
extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
extension=memcacahe.so
e.测试
建立一个test.php文件,测试php是否有memcache的一个模块
php操作memcache,保存并获取值
memcached的内存管理与删除机制
注意:
Memcache最大的value也只能是1M的空间。
注意:
内存碎片化永远都存在,只是哪一种方式可以使得内存碎片最小。
1.什么是内存碎片化?
在使用这种内存缓存系统的时候,由于不断的申请,释放,就会形成一些很小的内存片段,无法被利用,这种现象就叫做,内存的碎片化。
这个小红块就是操作系统无法使用的空间。
2.如何解决?
memcache利用slaballocator的方式来管理(每个slabclass大小为1M)
最小的单元叫做chunk(小块):
存放数据的仓库
多个小单元组成一个chunks:
多个小块组成(所有的小块的大小全部一致)
每个slabclass的大小为1M
3.memcache如何选择合适的大小?
注意:
如果122Bytes的slab装满了,现在有一个100Bytes的数据来了,存到哪里去?
答:
肯定不会存在144,还是存在122这个chunk里面,利用LRU算法来实现数据存储。
4.固定chunk带来的内存浪费,22B
5.factor调优
memcached在启动的时候,会按照一定的大小来组织slabclass,可以通过-f来指定
默认是1.25,相邻chunk之间的比值就是增加因子。
可以根据自己网站的业务调整缓存因子的大小。
是因为每个业务不一样,所需要的最小的chunk是不一样的。
这个参数使得我们的系统变得更加适应自己的业务,因为数据可以自己设定大小。
6.memcache的惰性删除
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。
这种行为被称为lazy(惰性)expiration。
因此,好处是memcached不会在过期监视上耗费CPU时间。
比如:
有set(name,asion,0,3600)过了3600秒就失效,失效后,并不会自动删除,只有当get查询时,检测是否过期,如果过期则删除。
例如#addname182当8s后,是失效,还是不存在?
通过stats分析
分析:
是失效你,而不是不存在,只有在下一次去获取时候,memcache才会去检测它是否过期,过期了就删除
7.memcache的LRU算法
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为LeastRecentlyUsed(LRU)机制来分配空间。
顾名思义,这是删除“最近最少使用”的记录的机制。
因此,当memcached的内存空间不足时(无法从slabclass获取到新的空间时),就从最近未被使用的记录中搜索,并将其空
间分配给新的记录。
从缓存的实用角度来看,该模型十分理想。
当mecache里面的数据空间(默认是64M)已经占满了,再继续存储数据能否存储呢?
答:
能存储,要删除过期的数据,如果都没有过期,则删除最不活跃的数据,腾出空间给后面添加数据。
例如:
以122Bytes的slab举例,当数据装满后,如果来了一个100Bytes数据,如何处理?
(即使永久有效,也会被踢)
分析:
内存的管理LRU算法、FIFO算法
8.memcache的一些参数Ctrl+C
注意:
在vim下如果输入了ctrl+s可以使用ctrl+q退出
-p监听的端口
-l连接的IP地址,默认是本机
-dstart启动memcached服务
-drestart重起memcached服务
-dstop|shutdown关闭正在运行的memcached服务
-dinstall安装memcached服务
-duninstall卸载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服务器的地址和端口
2.测试
1.开启session,保存session
2.从Memcache获取session
高级特性
分布式memcache配置
什么是分布式?
由于单台memcache的服务能力有限,可以使用多台memcache来提供缓存的功能,这种架构就叫做memcache的分布式缓(集群)存系统
如何实现?
可以这样理解,如何将数据分散答各台Memcache服务器上。
在客户端实现分布式,在数据保存之前,根据一定的算法,将数据保存到那台memcache服务器上,在获取数据的时候,按照前面相同的算法去对应的memcache服务器上获取数据
分布式算法
1.取摸算法
将key的值对服务器的台数取余,然后将对应的value值保存到对应的余数的那台memcache服务器上,一般这个hash函数crc32(key)%3
crc32()这个函数可以使得一个字符串变成一个32位的整数
坏处:
当某一台服务器宕机或者需要增加一台服务器的时候,这个时候缓存数据基本全部失效,因为除数变了。
不严格的公式,命中率=取到数据/总数1/NN代表服务器的台数
引发出来的问题:
当memcache宕机之后,缓存数据失效,这个时候MySQL的压力会骤增,
这个时候,MySQL会宕机,然后在重启MySQL,MySQL会在短时期内再次宕机,然后,稍微延迟一点(缓存已经重新建立了一部分),又宕机。
随着时间的慢慢推移,MySQL基本上趋于稳定,缓存系统成功建立。
因为缓存数据不存在,所有的请求全部要转向MySQL来提供,这种现象就叫做memcache的雪崩现象。
概图:
2.一致性hash实现分布式
a.假想有一个圆环,分布着从0到2^32这么多个正整数
b.然后在将服务器的节点数通过hash函数(crc32())运算后,按照顺时针的方向映射到上面的圆环上
c.将需要存储的数据的key也按照上面的hash函数运算后,按照顺时针的方向保存到一个不比自己小的节点上
注意:
只要是memcache宕机,就一定会有数据的丢失。
但是要想办法让数据丢失的最少,使用一致性hash,即使有一台服务器宕机,也只是影响一台服务器上的数据。
虚拟节点:
分担任务
缓存雪崩现象
雪崩造成的原因?
1.由于算法不当,取摸算法,造成大量缓存失效,会引发雪崩
解决方案:
一致性hash算法
2.缓存时间都是同一时间,缓存系统会在同一时间全部失效,这个也会造成雪崩
解决方案:
缓存时间设置成一个范围内的随机时间(3-9小时)
由于某个memcache节点的缓存数据失效,导致其他memcache节点的缓存命中率下降,缓存中缺失的数据会去MySQL数据库中查询,短时期内,造成了MySQL服务器压力巨大,造成宕机,就叫做缓存雪崩现象。
当重启MySQL之后,短期内再次宕机,但缓存数据已经建立了一部分,在MySQL反复多次启动之后,缓存全部重建完毕,MySQL不再宕机趋于稳定。
解决方案:
把缓存的时间设置成一个范围内的随机值(3-9小时),这样就在不同的时间段失效,把重建的工作分担到不同的时间上。
memcache如何做高可用
1.使用repcached实现,全称replicationcached是由日本人发明的memcached的高可用性技术,简称复制缓冲区技术。
2.MemcacheDB是一个分布式、key-value形式的持久存储系统。
由sina人员开发。
它不是一个缓存组件,而是一个基于对象存取的、可靠的、快速的持久存储引擎。
协议跟memcache一致(不完整),所以很多memcached客户端都可以跟它连接。
MemcacheDB采用BerkeleyDB作为持久存储组件,故很多BerkeleyDB的特性的他都支持。
扩展
1.如何在Linux下给一个php添加一个扩展,说出通用步骤?
答:
1.下载对应扩展源码
2.上传放入/usr/local/src/
3.解压并进入文件夹内
4.在文件夹内执行绝对路径下的phpize/usr/local/php/bin/phpize
5.执行configure./configure--with-php-config=/usr/local/php/bin/php-config
6.make&&makeinstall
7.生成一个目录文件,文件下面有一个.so结尾的文件
8.修改php.ini文件
9.增加extension_dir=目录extension=.so文件
10.重启Apache
11.添加phpinfo()
12.浏览器查看
2.memcache的安全性如何解决?
答:
由于memcache的本身设计就是极为简洁的,根本没有设置权限方面的限制。
为什么不设置权限?
只提供缓存功能,为了精简
1.放在内网192.168.1.110内网IP外网无法访问
2.写一个防火墙验证规则,只允许自己规定IP的包可以转进来,其他的全部丢弃
192.168.1.221---224
3.当使用文件保存session文件时候,如果文件过多,如何处理?
一般来说,超过65535个session文件的时候,这个时候session的获取就会变得异常缓慢,意味php代码执行很慢,如何解决?
答:
分层处理:
一个文件夹下建立A-Z开头的文件夹然后A_Z在建立
使用memcache处理:
单台memcache处理能力有限,就使用分布式memcache来处理
4.如何理解负载均衡集群也是高可用集群,但有不是?
答:
负载均衡集群提供了高可用的能力,如果某一台宕机之后,还是可以提供正常的服务,只是服务提供的有些吃力而已。
因为负载均衡集群不提供keepalive的机制。
监控机制
案例:
在项目中如何使用Memcache?
Memcache存在的意义就是缓存数据,减轻MySQL的压力。
1.书写一个列表页
2.详情页
扩展
1.Linux下安装一个php的扩展的通用方法
答:
1.下载对应的扩展的源码
2.将对于的扩展上传到Linux服务器上,放在(/usr/local/src/下)
3.执行tar-zxvfNAME.tar.gz
4.cdNAME
5.执行绝对路径下的phpize命名(/usr/local/php/bin/phpize)必须在扩展包的目录内
6.执行./configure--with-php-config=/usr/local/php/bin/php-config(--with-php-config=绝对路径下的php-config的路径,并且不需要指定安装的路径)
7.make&&m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 附加 memcache 笔记