php+nginx 缓存
nginx缓存
nginx有两种缓存机制:fastcgi_cache
和proxy_cache
下面我们来说说这两种缓存机制的区别吧:
- proxy_cache作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态的
- fastcgi_cache作用是缓存fastcgi生成的内容,很多情况是php生成的动态内容
- proxy_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端带宽
- fastcgi_cache缓存减少了nginx与php的通信次数,更减轻了php和数据库的压力。
proxy_cache缓存设置
注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path /data0/proxy_temp_dir;
设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
server
{
listen 80;
server_name www.yourdomain.com 192.168.8.42;
index index.html index.htm;
root /data0/htdocs/www;
location /
{
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
#对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 12h;
#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
expires 1d;
}
用于清除缓存,假设一个URL为http://192.168.8.42/test.txt
,通过访问http://192.168.8.42/purge/test.txt
就可以清除该URL的缓存。
location ~ /purge(/.*)
{
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.0.0/16;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
#扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
location ~ .*\.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
}
access_log off;
}
}
fastcgi_cache缓存设置
#定义缓存存放的文件夹
fastcgi_cache_path /tt/cache levels=1:2 keys_zone=NAME:2880m inactive=2d max_size=10G;
#定义缓存不同的url请求
fastcgi_cache_key "$scheme$request_method$host$uri$arg_filename$arg_x$arg_y";
server {
listen 8080;
server_name www.example .com;
location / {
root /www;
index index.html index.htm index.php;
}
location ~ (|.php)$ {
root /www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_cache NAME;
fastcgi_cache_valid 200 48h;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
#设置缓存的过程中发现无法获取cookie,经查需要定义这句话
fastcgi_pass_header Set-Cookie;
}
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /httplogs/access.log access;
}
总的来说nginx的proxy_cache
和fastcgi_cache
的缓存配置差不多。
mysql缓存
内存表,就是放在内存中的表,所使用内存的大小可通过My.cnf中的max_heap_table_size指定,如max_heap_table_size=1024M,内存表与临时表并不相同,临时表也是存放在内存中,临时表最大所需内存需要通过tmp_table_size = 128M设定。当数据超过临时表的最大值设定时,自动转为磁盘表,此时因需要进行IO操作,性能会大大下降,而内存表不会,内存表满后,会提示数据满错误。
临时表和内存表都可以人工创建,但临时表更多的作用是系统自己创建后,组织数据以提升性能,如子查询,临时表在多个连接之间不能共享。这里只讨论内存表
创建表是,用engine=heap可创建(mysql5.5中已经不支持type,以后都用engine,形成习惯)。
create table test
(
id int unsigned not null auto_increment primary key,
state char(10),
type char(20),
date char(30)
)ENGINE=MEMORY DEFAULT CHARSET=utf8;
内存表的特性:
-
内存表的表定义是存放在磁盘上的,扩展名为
.frm
, 所以重启不会丢失。 -
内存表的数据是存放在内存中的,所以重启会丢失数据。
-
内存表使用一个固定的记录长度格式。
-
内存表不支持
BLOB
或TEXT
列,比如varchar
与text
字段就不会被支持。 -
内存表支持
AUTO_INCREMENT
列和对可包含NULL值的列的索引(网上大多说不支持,这是错误的)。内存表支持大于(>) 小于( <)操作,网上也说不支持。 -
mysql重启后,主键、自增、索引仍然存在,只是数据丢失。这也是对网上的一些错误文字纠正。
-
内存表表在所有客户端之间共享(就像其它任何非TEMPORARY表)。
-
MEMORY存储引擎执行
HASH
和BTREE
索引。你可以通过添加一个如下所示的USING子句为给定的索引指定一个或另一个:CREATE TABLE lookup (id INT, INDEX USING HASH (id)) ENGINE = MEMORY; CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
-
内存表初始化,可以使用--init-file来初始化,避免重启mysql后数据被清空。比如
--init-file="/data/mysql/init.sql"
,init.sql
格式为:use db_test; select *** into m_table;
-
在数据库复制时,如果主机当掉,则会在binLog中自动加入delete from [内存表],将slave的数据也删除掉,以保证两边的数据一致性。
-
内存表不支持事务。
-
内存表是表锁,当修改频繁时,性能可能会下降。
内存表的使用
- 内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制。
- heap对所有用户的连接是可见的,这使得它非常适合做缓存。
- 仅适合使用的场合。heap不允许使用xxxTEXT和xxxBLOB数据类型。注:操作符 “<=>” 说明:
NULL-safe equal
.这个操作符和“=”操作符执行相同的比较操作,不过在两个操作码均为NULL时,其所得值为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。 - 一旦服务器重启,所有heap表数据丢失,但是heap表结构仍然存在,因为heap表结构是存放在实际数据库路径下的,不会自动删除。重启之后,heap将被清空,这时候对heap的查询结果都是空的。
- 如果heap是复制的某数据表,则复制之后所有主键、索引、自增等格式将不复存在,需要重新添加主键和索引,如果需要的话。
对于重启造成的数据丢失,有以下的解决办法:
- 在任何查询之前,执行一次简单的查询,判断heap表是否存在数据,如果不存在,则把数据重新写入,或者DROP表重新复制某张表。这需要多做一次查询。不过可以写成include文件,在需要用该heap表的页面随时调用,比较方便。
- 对于需要该heap表的页面,在该页面第一次且仅在第一次查询该表时,对数据集结果进行判断,如果结果为空,则需要重新写入数据。这样可以节省一次查询。
- 更好的办法是在mysql每次重新启动时自动写入数据到heap,但是需要配置服务器,过程比较复杂,通用性受到限制。
小记录,MyISAM与InnoDB互转
// InnoDB转MyISAM
ALTER TABLE `tablename` ENGINE = MYISAM
// MyISAM转InnoDB
alter table tablename type=innodb;
ALTER TABLE `tablename` ENGINE = InnoDB
memcache缓存
下面我们来看看memcache,相对而言mysql的内存表限制较多。
memcache的用途
1.提高系统的并发能力
2.减轻数据库的负担
注:memcache linux系统32位只支持4G内存,同时memcache最长保存时间为30天。
转自:http://www.nowamagic.net/librarys/veda/detail/1405
https://www.cnblogs.com/lost-1987/articles/2762117.html
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。