大型网站优化-memcache技术,优化-memcache技术_PHP教程
大型网站优化-memcache技术,优化-memcache技术
大型网站优化-memcache技术
memory+cache 内存缓存
memcache简介
memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 。这是一套开放源代码软件,以BSD license授权发布。【摘取自百度百科】
官网: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 |
让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 查看帮助:
操作memcache
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
使用php操作memcache
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,保存并获取值
memcached的内存管理与删除机制
注意: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服务器上,在获取数据的时候,按照前面相同的算法去对应的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如何做高可用
答:
答:
由于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'

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

URL panjang, sering berantakan dengan kata kunci dan parameter penjejakan, boleh menghalang pelawat. Skrip pemendekan URL menawarkan penyelesaian, mewujudkan pautan ringkas yang sesuai untuk media sosial dan platform lain. Skrip ini sangat berharga untuk laman web individu a

Laravel memudahkan mengendalikan data sesi sementara menggunakan kaedah flash intuitifnya. Ini sesuai untuk memaparkan mesej ringkas, makluman, atau pemberitahuan dalam permohonan anda. Data hanya berterusan untuk permintaan seterusnya secara lalai: $ permintaan-

Ini adalah bahagian kedua dan terakhir siri untuk membina aplikasi React dengan back-end Laravel. Di bahagian pertama siri ini, kami mencipta API RESTful menggunakan Laravel untuk aplikasi penyenaraian produk asas. Dalam tutorial ini, kita akan menjadi dev

Laravel menyediakan sintaks simulasi respons HTTP ringkas, memudahkan ujian interaksi HTTP. Pendekatan ini dengan ketara mengurangkan redundansi kod semasa membuat simulasi ujian anda lebih intuitif. Pelaksanaan asas menyediakan pelbagai jenis pintasan jenis tindak balas: Gunakan Illuminate \ Support \ Facades \ http; Http :: palsu ([ 'Google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

Pelanjutan URL Pelanggan PHP (CURL) adalah alat yang berkuasa untuk pemaju, membolehkan interaksi lancar dengan pelayan jauh dan API rehat. Dengan memanfaatkan libcurl, perpustakaan pemindahan fail multi-protokol yang dihormati, php curl memudahkan execu yang cekap

Adakah anda ingin memberikan penyelesaian segera, segera kepada masalah yang paling mendesak pelanggan anda? Sembang langsung membolehkan anda mempunyai perbualan masa nyata dengan pelanggan dan menyelesaikan masalah mereka dengan serta-merta. Ia membolehkan anda memberikan perkhidmatan yang lebih pantas kepada adat anda

Tinjauan Landskap PHP 2025 menyiasat trend pembangunan PHP semasa. Ia meneroka penggunaan rangka kerja, kaedah penempatan, dan cabaran, yang bertujuan memberi gambaran kepada pemaju dan perniagaan. Tinjauan ini menjangkakan pertumbuhan dalam PHP Versio moden

Dalam artikel ini, kami akan meneroka sistem pemberitahuan dalam rangka kerja web Laravel. Sistem pemberitahuan di Laravel membolehkan anda menghantar pemberitahuan kepada pengguna melalui saluran yang berbeza. Hari ini, kami akan membincangkan bagaimana anda boleh menghantar pemberitahuan ov
