美文网首页spring boot
使用Nginx+Memcache做页面缓存

使用Nginx+Memcache做页面缓存

作者: imjcw | 来源:发表于2019-12-19 15:08 被阅读0次

前言

官方商城改版之后,为了提升动态页面的访问速度,对商城的一些页面进行了缓存,使其在一定时间之内避免了重复的查询和编译。

原理

主要使用了 nginxmemcached_module 模块,直接从 Memcache 服务器中读取并输出。

如若不存在,则执行相应程序,并将结果写入 Memcahce

结构图

使用Memcached做页面缓存结构图

主要流程是:

用户的请求进来,NginxMemcache 获取数据,如若成功,则直接返回给客服端。如若失败,则 Nginx 会报 not found 错误,这个时候,需要 rewirte 执行相关应用程序,在页面渲染结束后,将结果写入 Memcache 。那么下次请求,将直接从 Memcache 获取。

具体实现

Nginx 的配置

upstream memcacheds {
    server 127.0.0.1:11211;
}
server {
    ... # 这里的配置不变
    location @rewrite {
        rewrite ^/(.*)$ /index.php?/$1 last;
    }
    set $memcached_key 0; # 初始化一下$memcached_key
    location ~ /(articles)  {
        set $memcached_key $host$uri; # 用url作为标识
        add_header X-IMJCW-Key $memcached_key; # 加到header里,方便管理
        default_type text/html;
        memcached_connect_timeout 1s;
        memcached_read_timeout 2s;
        memcached_send_timeout 2s;
        memcached_pass  memcacheds;
        memcached_gzip_flag 2;
        error_page 404 502 504 = @rewrite;
    }
    ... # 这里的配置不变
    location ~ \.php$ {
        ... # 这里的配置不变
        fastcgi_param X-MEMCACHE-KEY $memcached_key; # 设置参数,为程序是否需要缓存页面做判断
        ... # 这里的配置不变
    }
    ... # 这里的配置不变
}

PHP代码

<?php
// 初始化一下 HTML,这里就不动态生成了
$html = 'Hello World';
// 因为缓存的是页面,所以判断一下请求方式是否是 GET
// 同时判断 $_SERVER 里是否存在 X-MEMCACHE-KEY,并且不为空
if ($_SERVER['REQUEST_METHOD'] != 'GET' || !isset($_SERVER['X-MEMCACHE-KEY']) || !$_SERVER['X-MEMCACHE-KEY']) {
    echo $html;
    exit();
}
// 获取 X-MEMCACHE-KEY
$memcachedKey = $_SERVER['X-MEMCACHE-KEY'];
// 连接 Memcached
$memcached = new \Memcached();
$memcached->addServer('127.0.0.1', '11211', false);
// 存储
$memcached->set($memcachedKey, $html);
// 留个证据
header('X-IMJCW: miss');
header('X-IMJCW-Key: ' . $xMemcacheKey);
echo $html;

示例

Tips:这里的示例不是由上述代码执行输出的,逻辑是一样的。

第一次访问页面:

第一次访问页面

第二次访问页面:

第二次访问页面

页面输出乱码的问题

在实际应用中,我发现效果并没有我想象的那么美好,主要原因是:页面输出乱码了。

经过多方面查询和向同事的请教,最终得出的结论是:

由于存储到 Memcache 里的数据太大,以至于压缩了一遍后,还是很大,于是又压缩…就这样,输出的时候是压缩后的数据,结果造成了页面乱码的问题。

至于解决方案,有两个:

一、关闭压缩功能

<?php
...
// 获取 X-MEMCACHE-KEY
$memcachedKey = $_SERVER['X-MEMCACHE-KEY'];
// 连接 Memcached
$memcached = new \Memcached();
$memcached->addServer('127.0.0.1', '11211', false);
$memcached->setOption(\Memcached::OPT_COMPRESSION, false);
// 存储
$memcached->set($memcachedKey, $html);
...

二、修改 PHP 配置,修改 Memcache 压缩阈值

有则修改,无则添加。

...
[memcached]
memcached.compression_threshold = 1048576
...

修改完成以后,需要重启 php-fpm

总结

在配置的过程中还算顺利,只是遇到了一个乱码的问题。也是由于我用的比较简单,所以很多问题并没有暴露出来。不积跬步,无以至千里。加油吧,骚年。

-- EOF --
本文转载自IMJCW
原文链接:使用Nginx+Memcache做页面缓存

相关文章

  • 使用Nginx+Memcache做页面缓存

    前言 官方商城改版之后,为了提升动态页面的访问速度,对商城的一些页面进行了缓存,使其在一定时间之内避免了重复的查询...

  • 高访问量高并发问题解决方案(1)

    1.尽量使用缓存技术来做。用户缓存、页面缓存等一切缓存,使用特定的机制进行刷新。利用消耗内存空间来换取用户的效率。...

  • 07 | 客户端缓存的分类和介绍

    BS 架构 页面缓存; 浏览器缓存; 移动互联网架构 APP 自身使用的缓存; 页面缓存 含义 页面自身对某些元素...

  • rails缓存技术

    三种缓存技术:页面,动作和片段。 Rails 默认支持片段缓存。如果想使用页面缓存和动作缓存,要在 Gemfile...

  • vue服务端渲染浏览器端缓存(keep-alive)

    在使用服务器端渲染时,除了服务端的接口缓存、页面缓存、组建缓存等,浏览器端也避免不了要使用缓存,减少页面的重绘。这...

  • Android webView 缓存处理

    一 缓存模式 使用方式 二 清理缓存 1,页面缓存: >指加载一个网页时的html、JS、CSS等页面或者资源...

  • 对于缓存,你可能一直理解错了!

    这篇文章我结合我自己使用缓存的历程,谈谈我对缓存的认识。 01 本地缓存 1. 页面级缓存 我使用缓存的时间很早,...

  • Vue2开发WebApp滚动条不缓存的问题

    在用Vue2开发webapp的过程中,为了体验更加友好,使用了keep-alive来做页面缓存,当页面跳转时...

  • vue中在指定页面跳转时缓存页面

    vue的缓存页面是使用keep-alive实现,那如果要实现在某些指定页面之间切换才缓存页面要怎么实现呢? 比如现...

  • 页面优化技术

    1. 页面缓存+URL缓存+对象缓存 1.1页面缓存 例如缓存商品列表页面,先从redis缓存里面拿取页面,如果没...

网友评论

    本文标题:使用Nginx+Memcache做页面缓存

    本文链接:https://www.haomeiwen.com/subject/mmxtnctx.html