目录
一、大型网站优化
1、网站访问流程
随着网站迭代开发,访问会变慢
LNMP
架构中网站应用访问流程
浏览器
=>web
服务器
=>
后端服务(中间件
)=>
数据库(
mysql
)
访问流程越多,访问速度和出现问题的几率也越大
优化访问速度,就需要减少访问步骤或者提高单步骤的速度
2、如何优化
根据网页的访问流程,可以进行以下优化:
①提高
web
服务器并发
负载均衡(多台服务器架构)
②页面静态化
把经常访问,但是数据不经常发生变动的动态页面,制作为静态页面
③内存缓存优化
把经常访问的数据,加载到内存中使用
④数据库优化
很多时候,还需要取数据库信息,所以优化数据库本身
3、统计访问量
户数量:
10000-12000
(户量猛增)
PV
:
100000-500000
(24时访问次数总和)
QPS
:
50-100*
(每秒访问次数)
DAU
:
2000(每日活跃户数)
随着业务量增加,访问量越来越大,用户在访问某些页面数据时,通过慢查询日志发现慢查询
SQL
,经 过优化之后效果还是不够明显。而此类数据发生变动的频率又较小,故提出使用缓存中间件(一般会将数据存储到内存中)的方式,降低MySQL
的读压力,提高整个业务架构集群的稳定和快速响应能力
memcached介绍和安装启动
1、介绍
memory cache cache in memory
缓存放入内存中
Memcached
是国外社区网站
LiveJournal
的开发团队开发的 高性能的分布式内存缓存服务器。一般的 使用目的是通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web
应用的速度、提高访问效率
2、安装启动软件
官方网址
:
http://memcached.org/
①上传软件到服务器
软件包名称
memcached-1.5.8.tar.gz
②解压并编译安装
#memcache依赖libevent 安装libevent-devel解决
[root@localhost ~]# yum -y install libevent-devel
#编译安装memcached
[root@localhost ~]# tar xvf memcached-1.5.8.tar.gz
[root@localhost ~]# cd memcached-1.5.8
[root@localhost ~]# ./configure --prefix=/usr/local/memcached
[root@localhost ~]# make && make install
③查看软件启动参数,并启动
[root@localhost ~]# cd /usr/local/memcached/bin
[root@localhost ~]# ./memcached -h
#常用参数
-p是设置Memcache监听的端口,最好是1024以上的端口;
-d是启动一个守护进程;
-m是分配给Memcache使用的内存数量,单位是MB;
-u是运行Memcache的用户;
-l是监听的服务器IP地址,可以有多个地址;
-c是最大运行的并发连接数,默认是1024;
-P是设置保存Memcache的pid文件
启动
memcached
#进入memcached文件目录
[root@localhost ~]# cd /usr/local/memcached/bin
#后台启动memcached 可以创建一个普通用户(memcached) 用来启动管理memcached软件
[root@localhost ~]# ./memcached -uroot -d
#进程查看是否启动成功
[root@localhost ~]# ps aux |grep memcached
3、memcached使用
1、命令行连接和操作
1.1、telnet连接使用
memcached
默认使用启动服务占用
tcp 11211
端口。可以通过
telnet
进行连接使用
#安装telnet客户端
[root@localhost ~]# yum -y install telnet
#通过telnet连接11211端口
[root@localhost bin]# telnet 192.168.136.212 11211
1.2、存储命令
语法:
set
set
命令用于将
value(
数据值
)
存储在指定的
key(
键
)
中
如果
set
的
key
已经存在,该命令可以更新该
key
所对应的原来的数据,也就是实现更新的作用
#语法
set key flag exptime bytes
value
#flag服务端提供的一个标识,默认没什么意义,默认可以传个0,这个标识是为了编程语言一个状态,例
如:flag(0,1) 代表是否采用压缩机制 0代表不压缩,1代表压缩
#exptime过期时间,0代表不过期
#bytes字节
#value值
#举例
set name 0 0 8
zhangsan
#查看
get name
语法:
add
add
命令用于将
value(
数据值
)
存储在指定的
key(
键
)
中
如果
add
的
key
已经存在,则不会更新数据
(
过期的
key
会更新
)
,之前的值将仍然保持相同,并且您将
获得响应
NOT_STORED
#举例
add age 0 0 2
18
语法:
replace
replace
命令用于替换已存在的
key(
键
)
的
value(
数据值
)
如果
key
不存在,则替换失败,并且您将获得响应
NOT_STORED
#举例
replace name 0 0 3
yun
语法:
append
append
命令用于向已存在
key(
键
)
的
value(
数据值
)
后面追加数据
#查看
get name
VALUE name 0 3
yun
#追加
append name 0 0 6
haochi
#查看
get name
VALUE name 0 9
yunhaochi
语法:
prepend
prepend
命令用于向已存在
key(
键
)
的
value(
数据值
)
前面追加数据
#举例
prepend name 0 0 1
a
1.3、删除命令
语法:
delete
delete
命令用于删除已存在的
key(
键
)
#语法
delete key
语法:
flush_all
flush_all
命令用于清理缓存中的所有
key=>value(
键
=>
值
)
对
该命令提供了一个可选参数
time
,用于在制定的时间后执行清理缓存操作
#语法
flush_all [time]
1.4、查找和计算命令
语法:
get
get
命令获取存储在
key(
键
)
中的
value(
数据值
)
,如果
key
不存在,则返回空
#语法
get key1 key2 key3
语法:
incr(
相加
)/decr
(相减)
incr
与
decr
命令用于对已存在的
key(
键
)
的数字值进行自增或自减操作
incr
与
decr
命令操作的数据必须是十进制的
32
位无符号整数(无负数)
#语法
incr key value
decr key value
1.5、统计状态命令
语法:
stats
stats
命令用于返回统计信息例如
PID(
进程号
)
、版本号、连接数等
stats
的参数参考
pid: memcache服务器进程ID
uptime:服务器已运行秒数
time:服务器当前Unix时间戳
version:memcache版本
pointer_size:操作系统指针大小
rusage_user:进程累计用户时间
rusage_system:进程累计系统时间
curr_connections:当前连接数量
total_connections:Memcached运行以来连接总数
connection_structures:Memcached分配的连接结构数量
cmd_get:get命令请求次数
cmd_set:set命令请求次数
cmd_flush:flush命令请求次数
get_hits:get命令命中次数
get_misses:get命令未命中次数
delete_misses:delete命令未命中次数
delete_hits:delete命令命中次数
incr_misses:incr命令未命中次数
incr_hits:incr命令命中次数
decr_misses:decr命令未命中次数
decr_hits:decr命令命中次数
cas_misses:cas命令未命中次数
cas_hits:cas命令命中次数
cas_badval:使用擦拭次数
auth_cmds:认证命令处理的次数
auth_errors:认证失败数目
bytes_read:读取总字节数
bytes_written:发送总字节数
limit_maxbytes:分配的内存总大小(字节)
accepting_conns:服务器是否达到过最大连接(0/1)
listen_disabled_num:失效的监听数
threads:当前线程数
conn_yields:连接操作主动放弃数目
bytes:当前存储占用的字节数
curr_items:当前存储的数据总数
total_items:启动以来存储的数据总数
evictions:LRU释放的对象数目
reclaimed:已过期的数据条目来存储新数据的数目
缓存命中率
:命中数(
get
获取到数据)
/
获取次数(
get
的次数)
get_hits/cmd_get
,
如果命中率低,业务代码缓存有问题,命中率为
0
,缓存没有起作用
==
缓存穿透
==
访问的数据,数据库不存在的数据,每次都不能够生成缓存,每次请求都直接访问数据库,穿透了
缓存,缓存没有起到作用。数据库压力没有得到缓解。
解决方案,数据库查不到的,也做一个空缓存。
==
缓存雪崩
==
缓存具有失效时间,如果缓存失效时间都是一样,本来应该请求缓存的,但是因为缓存失效了,全
部请求到了数据库,数据库压力剧增,可能会造成数据库宕机,进而造成系统崩溃。
解决方案,设置缓存的失效时间均匀分布
2、memcached_tool.php工具
查看
memcached
运行状态、
key(item)
的数量了、内存使用量等,需要
php
的运行环境
①上传
memcached_tool.php
到
web
服务器
上传到虚拟机主机可以访问的目录即可。
②修改连接参数
[root@localhost ~]# vim memcached_tool.php
#修改内容:
define('ADMIN_USERNAME','root'); // Admin Username
define('ADMIN_PASSWORD','123456'); // Admin Password
$MEMCACHE_SERVERS[] = '192.168.136.212:11211'; // memcacched server ip
③查看使用
http://192.168.136.212/memcached_tool.php
