1. 介绍

cache就是人们所说的缓存。我们这里所说的cache是web上的。对用户来说,衡量一个网站是否具有良好的体验,其中一个标准就是响应速度的快慢。可能网站刚上线,功能还较少,数据库的记录也不多的情况下,网站可能访问速度比较快,也不需要优化。但是随着网站发展起来,功能越来越多,数据库越来越大的时候,这个时候可能网站的访问速度就会下降。无论网站刚上线初期还是到一定程度的情况,我们都希望网站具有良好的响应速度。

而要怎样提高页面响应速度呢?其中一个方法当然就是本章所说的cache。先来说整个网站的请求响应的过程:用户从浏览器发出一个请求,比如点击一个按钮或在浏览器输入网址回车,然后经过层层的网络最终到达网站的服务器,假设我们用nginx来作为静态文件服务器,而用unicorn作为运行ruby代码的容器,先经过nginx处理,nginx一般是处理html,css,js的,它会默认处理带有htlm,css,js后缀的请求,比如/articles.html,如果发现有它处理不了的,比如/articles/1这样的请求地址,因为nginx没有匹配这样的地址,就会反向代理到unicorn,unicorn是运行ruby代码的,它会连接数据库,它可能从数据库取到一些数据,把数据处理完,再返回给nginx,最nginx返回给用户。

这里所说的unicorn是运行ruby代码的应用容器,当然也可以是php或java的容器,比如tomcat等。道理是一样的。

server {
listen 80 default_server;
server_name www.rails365.net;
root /home/yinsigan/rails365/current/public;
... try_files $uri/index.html $uri @rails365;
location @rails365 {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://rails365;
}
... }

上面是nginx的配置文件的部分内容,网站根目录是/home/yinsigan/rails365/current/public,具体看try_files $uri/index.html $uri @rails365;这一句,当用户在浏览器请求/about.html地址时,nginx会首先看网站根目录有没有about.html这个文件,有的话就直接读出根目录下的about.html,因为nginx默认会对html后缀的文件作处理的,读完后直接返回响应给用户,就完成了这一次请求,没有的话,就会请求@rails365的内容,也就是反向代理到unicorn服务器。

整个请求过程无论哪一阶段都是需要时间的。而最影响速度也最容易产生性能瓶颈的主要有三个地方:

  1. nginx处理静态文件的过程
  2. nginx和unicorn交互的过程
  3. unicorn和数据库交互的过程

第一点,nginx处理静态文件的过程主要指的是处理图片、javascript、css文件的过程。假如这些文件数量很多,体积又很大,在这一过程是需要耗费很多时间的,但是这些可以通过nginx的gzip来压缩大小、浏览器cache或CDN等技术来解决,这点不在cache的范围内。

第二点,nginx作为反向代理服务器和应用服务器unicorn的交互也是需要时间的,nginx也作为静态服务器只能处理一些简单的静态服务器,而unicorn可以处理复杂的逻辑,不过最后unicorn还是要转化成html给nginx,nginx再给用户,所以整个请求过程如果不到unicorn,由nginx直接返回那就更好了。这样是能大大增快响应速度的,因为不仅nginx到unicorn那步少了,而unicorn到数据库这一步也不用了,所以还是有效的,但是它有一些不好的弊端,具体的我们下面会说到。第二点的解决方案是通过nginx的proxy_cache或者文件cache来解决。

第三点,应用服务器和数据库的交互,这个数据库我们一般指的是关系型数据库,比如MySQL、PostgreSQL等。这个过程是很重要且很常见的,毕竟几乎所有网站都需要数据库来存储数据吧,但数据库很庞大时或者对数据库处理不当时,这个交互过程是很耗费时间的,所以我们会在这个过程用redis作为cache来解决。

2. cache的种类

cache有很多种,比如上文提到的文件cache,nginx的proxy_cache,浏览器的cache,html片断的cache,除此之外,还有代理服务器的cache,CDN的cache,数据库级的查询cache。这篇文章我们只会讲述文件cache还有用redis来实现cache的情况。

3. 文件cache

文件cache在上文有提到,就是在nginx和unicorn交互的过程中发挥作用的,就是让请求直接给nginx处理,而不经过unicorn。打个比方,比如要浏览一个博客网站的首页,首页列出了最近的十篇博文,这些博文肯定是存储在数据库中,请求先通过nginx,nginx再通过unicorn,unicorn去数据库取到这些博文,再组装成html文件再给nginx,nginx再给用户,整个过程完成。而文件cache要做的是当unicorn组装成html给nginx的时候,也顺便在网站根目录下生成.html结尾的文件,这样下次访问就不用经过unicorn了,直接在网站根目录取文件就可以了。这种方式,说白了,就是把动态的查询静态化,让请求过程少了,当数据库有查询瓶颈的时候用这种方式是有好处的。但是这种方式有一个弊端,就是有登录系统的情况,比如一个首页,同样是相同的网址,每个人访问就有不同的页面,因为是不同的用户在访问,比如导航菜单,可以就会出现你的名字。文件cache办不到这种事,因为它是根据地址来处理的,比如访问http://www.example.com/articles.html,它会找根目录的articles.html文件,可是这个文件只有一个啊,但我们需要的是有多少个用户就有不同的页面,所以它不好判断,就算判断了,也失去了本来静态化的意义。所以文件cache只适合那种展示页面用的,很多时候并不适用,毕竟现在谁的网站没个登录系统呢。

4. 用redis实现cache的原理

上文也有提到文件cache的情况,cache的原理就是用一种访问更快的介质或更少的请求来提高查询速度。用redis来实现cache也是一样的道理。我们先不管redis最终会存储什么内容,我们有个对比的介质,那就是关系型数据库,把存到关系型数据库的内容换到redis来存,那就是用redis来实现的cache。这样就出现了两种存储介质的数据的对比,这个数据的存储是有时间性的。当第一次浏览带有数据库查询的页面的时候,页面的数据先从数据库那里获取,获取完之后存一份到redis,比如存成string,articles_count: 100,意思是把文章的总数存到redis中。当存到redis时,我们可以设置过期时间,也可以让它永远不过期。第二次以及以后的访问,就会直接到redis去查找key为articles_count的是不是有值(数据过期就等于没有值),有的话,直接取,没有话,还是会取数据库,然后再放到redis。当你的真实的数据库记录更新的时候,比如这个时候增加了一篇文章,除了把这一篇文章存进数据库外,还要把redis中的对应的值改过来,这样就能保证取到最新的值的。

5. 页面哪些地方需要cache

现在以本站作为实例,来考虑下页面上哪些地方要使用cache。使用cache有个原则,就是这个页面部分的内容可能是耗时的,也有可能是很少改变的。比如底部,这个部分是基本不变的。

redis实现cache系统原理(五)的更多相关文章

  1. redis实现cache系统实践(六)

    1. 介绍 rails中就自带有cache功能,不过它默认是用文件来存储数据的.我们要改为使用redis来存储.而且我们也需要把sessions也存放到redis中.关于rails实现cache功能的 ...

  2. 使用redis完成秒杀系统原理

    假设秒杀商品数为100,list名称为winner_user 参考视频教程:https://www.imooc.com/video/15167

  3. 利用多写Redis实现分布式锁原理与实现分析(转)

    利用多写Redis实现分布式锁原理与实现分析   一.关于分布式锁 关于分布式锁,可能绝大部分人都会或多或少涉及到. 我举二个例子:场景一:从前端界面发起一笔支付请求,如果前端没有做防重处理,那么可能 ...

  4. 深入理解Redis主键失效原理及实现机制(转)

    原文:深入理解Redis主键失效原理及实现机制 作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Redis 也不例外.在 Redis 提供的诸多命令中,EXPIRE.EXPIREA ...

  5. Android系统的五种数据存储形式(一)

    Android系统有五种数据存储形式,分别是文件存储.SP存储.数据库存储.contentprovider 内容提供者.网络存储.其中,前四个是本地存储.存储的类型包括简单文本.窗口状态存储.音频视频 ...

  6. Couchbase介绍,更好的Cache系统

    在移动互联网时代,我们面对的是更多的客户端,更低的请求延迟,这当然需要对数据做大量的 Cache 以提高读写速度. 术语 节点:指集群里的一台服务器. 现有 Cache 系统的特点 目前业界使用得最多 ...

  7. Couchbase 介绍 - 更好的 Cache 系统

    在移动互联网时代,我们面对的是更多的客户端,更低的请求延迟,这当然需要对数据做大量的 Cache 以提高读写速度. 术语 节点:指集群里的一台服务器. 现有 Cache 系统的特点 目前业界使用得最多 ...

  8. Cache的原理、设计及实现

    Cache的原理.设计及实现 前言 虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构.指令结构.信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特 ...

  9. (转)Couchbase介绍,更好的Cache系统

    在移动互联网时代,我们面对的是更多的客户端,更低的请求延迟,这当然需要对数据做大量的 Cache 以提高读写速度. 术语 节点:指集群里的一台服务器. 现有 Cache 系统的特点 目前业界使用得最多 ...

随机推荐

  1. hdu 1022 Train Problem

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. Javaweb开发中关于不同地方出现的绝对路径和相对路径

    1.转发和包含路径 a)以“/”开头:相对当前项目路径,即默认为http://localhost:8080/项目名/ b)不以“/”开头:相对当前Servlet路径. eg:在Aservlet中写“B ...

  3. iOS关于版本更新的问题

    // 获取app版本 NSString *app_Version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBun ...

  4. nginx+keepalived构建高可用服务

    1.整体环境规划 虚拟IP:10.0.4.248 主Nginx:10.0.4.249 备用Nginx:10.0.4.250 2.keepalived安装 #cd /usr/local/src #wge ...

  5. Linux利器:WinSCP,Putty,pscp和psftp

    # Summary PuTTY (Telnet 和 SSH 客户端) PSCP (SCP 客户端, 命令行下通过 SSH 拷贝文件,类似于 Unix/Linux 下的 scp 命令) PSFTP (S ...

  6. php 怎么查看是否开启了socket

    <?php if(extension_loaded('sockets')){ echo "已开启"; }else{ echo "未开启"; } ?>

  7. WebAPI发布IIS报错问题

    1.看IIS中处理程序映射中有没有注册:ExtensionlessUrlHandler-Integrated-4.0 没有的话需要在[运行]中注册:aspnet_regiis.exe 2.配置文件中要 ...

  8. 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开, ...

  9. ios 怎样将不支持ARC的文件设为支持ARC的--JSON

    怎样将不支持ARC的文件设为支持ARC的 双击须要改动的文件加上一句话就可以 -fno-objc-arc

  10. (转)c/c++内存对齐问题

    struct/class/unio内存对齐: http://blog.csdn.net/microsues/article/details/6140329 class函数占用字节数问题: http:/ ...