今天算是认识到博客园里的审查团队多内幕了,哈哈,贴个图玩下。

气死宝宝了。

进入主题!

今天就不写什么功能性的了,换下口味说下关于页面级的缓存,应该怎么做。

相信有很多小伙伴查了百度,甚至google,看了很多文章,以前我也这样做了,但是发现,上面写的真的不知所云。

有两点可以看出他们哪里不行:

  • 第一,网上有很多种写法,只要你稍微有点redis基础,就是懂得redis的五种数据结构的用法,就会发现很明显的错误,连接口都写错了。
  • 第二,缓存时间,你会发现很多他们写了缓存,但是没有缓存的过期时间,这是致命伤,没有什么缓存是不过期的,只是缓存的时间长短而已。你可以给10秒,也可以给10个月。看你具体的业务而定。后面会教你如何判断时间长短。

上面就是判断网上一些写页面缓存的文章好不好的依据,每个人的用法总会有点不一样,小弟也不敢妄下定论,仅供参考。

前提分析!

还是直接上图:

上面的图,我分为了三个层级去做页面缓存,其实不一定要三个层面都实现的,如果你做了页面级的,项目初期是够了,作为接口级,基本可以解决很多吞吐量。

对于上面的三个层级,我用了同一个方法去做。

知识准备:

  • string redis数据结构(这里我一直都找不到更好的替代品,string主要是方便我操作它的过期时间)
  • expire()函数,设置键的生存时间。
  • exists()函数,判断键是否存在。(判断的方法有很多种,ttl()获取它的生存时间,get()函数,判断是否有数据(不过get判断最好不用))。

好了,废话说完了,直接上代码!

 <?php
class Test
{
public $redis = null; public function __construct()
{
$this->redis = new Redis();
$this->redis->connect('127.0.0.1',6379);
$this->redis->auth('');
}
//这里是个例子模型,按照自己的用法去套进去就行
//以文章为例子吧
//页面级,接口级都可以用
public function getData()
{
//判断缓存的键是否还存在
if(!$this->redis->exists("cache:".$commentid))
{
//缓存不存在
//下面的get_mysql_data()函数只是个例子,按照自己具体情况去mysql获取数据
$data = $this->get_mysql_data();
$json = json_encode($data,JSON_UNESCAPED_UNICODE);
//存入redis
$this->redis->set("cache:".$commentid,$json);
//设置过期时间5分钟
$this->redis->expire("cache:".$commentid,60*60*5);
} $json = $this->redis->get("cache:".$commentid);
$data = json_decode($json,true);
return $data;
}
}

对于上面的代码有几点提示:

  • 上面只是一个例子,看你自己具体的使用去定
  • 其中mysql数据获取的哪里,要看你自己mysql使用mysqli或者pdo等等方法获取的,哪里随便你替换。
  • 过期时间哪里等下就说
  • 看到30.31行,那里为什么重新从redis拿多一次数据呢?为什么不直接返回mysql的$data不就行了,其实是可以的,只是为了防止redis没有把数据缓存进去,而做的一步,还有一步报错,我没写,自己添加进去吧。

下面说下怎么设置过期时间:

这个是没有一个统一的说法的,第一根据你的项目阶段,第二是用户流量的多少,第三是数据的冷热程度等方面去判断。

项目阶段:其实和用户流量有很多的关联,举个例子,假设你的项目在初期,但是用户已经爆炸了,这时,设置的缓存时间可以贼短,哪怕2秒,都能帮你解决很大的吞吐量。

冷热程度:冷指的是用户浏览次数少的,热的就很明显啦,热还有一种特殊的代表,数据的更新频率,更新频率高的应该时间约短。

特殊操作:更新部分数据时,可以考虑将对应的缓存键时间设为过期,这样用户看到的数据都是最新的,而且缓存功能依然存在,设置生存时间过期,很简单,expire设置为0就可以了

另一种页面缓存:

下面介绍一种不一样的数据缓存:

突然不想写了,因为我感觉上面的做法算是涵盖了,算是上面的接口级的做法。我就简单说下算了。

这里还是以文章为例子吧,我们论坛里最多的肯定是文章啦,那文章的热度肯定有排序的。对于热文章的访问量是比较大的,然后我们就要缓存假设排名在10000名之内的文章,对于超出这个数的文章,可以不用缓存。

这里顺便预告下,下篇文章是写关于排行榜的,日榜,周榜,年度榜该怎样做。

欢迎交流!

PHP+Redis 实例【二】页面缓存 新玩法的更多相关文章

  1. Ajax实例二:取得新内容

    Ajax实例二:取得新内容 通过点击pre和next按钮,从服务器取得最新内容. HTML代码 <div id="slide">图片显示区</div> &l ...

  2. 老司机带你体验SYS库多种新玩法

    导读 如何更加愉快地利用sys库做一些监控? 快来,跟上老司机,体验sys库的多种新玩法~ MySQL5.7的新特性中,非常突出的特性之一就是sys库,不仅可以通过sys库完成MySQL信息的收集,还 ...

  3. 【转帖】Moodle平台的5个新玩法

    [玩坏Moodle平台]Moodle平台的5个新玩法 1.RSS订阅 Moodle平台可以导入外部博客(或其他提供RSS的服务),并显示在Moodle内置的博客系统中.无论是自己的个人网站还是他人的博 ...

  4. MySQL高可用新玩法之MGR+Consul

    前面的文章有提到过利用consul+mha实现mysql的高可用,以及利用consul+sentinel实现redis的高可用,具体的请查看:http://www.cnblogs.com/gomysq ...

  5. 摹客iDoc「标注」新玩法!这些细节让你爱不释手(201903-2版本更新)

    哈喽小伙伴们,我们又见面啦!没错,小摹就是来告诉大家:摹客iDoc又双叒叕升级了!这次又上线了许多新玩法,在此之前,小摹先带大家温习一下iDoc以往的知识点: 攻城狮查看标注的利器 —— 标注信息智能 ...

  6. Github 新玩法 -- Profile ReadMe

    Github 新玩法 -- Profile ReadMe Intro 今天刷 Github 的时候偶然发现一个新的玩法,Github Profile ReadMe,可以在个人的 Profile 页面展 ...

  7. WEB安全新玩法 [1] 业务安全动态加固平台

    近年来,信息安全体系建设趋于完善,以注入攻击.跨站攻击等为代表的传统 Web 应用层攻击很大程度上得到了缓解.但是,Web 应用的业务功能日益丰富.在线交易活动愈加频繁,新的安全问题也随之呈现:基于 ...

  8. 告别尬聊,解锁秀场+社交新玩法(内含源码+Demo)

    直播已成为用户的生活习惯之一 艾媒咨询数据显示:2021年直播用户规模达到6.35亿人,在线直播用户以年轻群体为主,24岁及以下用户占比49%,30岁以下用户接近8成. 众所周知,Z世代用户是一个社交 ...

  9. 自定义 checkbox 新玩法 ?

    自定义 checkbox 新玩法 ? 第一步:selector 编写 drawable/selector_checkbox_voice.xml <?xml version="1.0&q ...

随机推荐

  1. 【转】花开正当时,十四款120/128GB SSD横向评测

    原文地址:http://www.expreview.com/19604-all.html SSD横评是最具消费指导意义的评测文章,也是各类热门SSD固态硬盘的决斗疆场.SSD评测在行业内已经有不少网站 ...

  2. (MariaDB)MySQL内置函数大全

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  3. 1_ROS学习

    1_搭建树莓派环境 树莓派是一个嵌入式计算机,专门用来做嵌入式开发的.我们组上用的树莓派是raspberry pi 3 mode B,5V供电,最大电流不超过2A: 我们需要在树莓派上安装上操作系统. ...

  4. angular控制器常用的4种通信方式

    首先概括一下angular控制器通信的4种方式: 作用域继承. 通过$scope广播事件. 事件发射器模块. 服务. 1.作用域的继承 子作用域可以访问声明在它们的祖先作用域中的变量和函数. < ...

  5. LINUX环境下SVN安装与配置(利用钩子同步开发环境与测试环境)

    安装采用YUM一键安装: 1.环境Centos 6.6 2.安装svnyum -y install subversion 3.配置 建立版本库目录mkdir /www/svndata svnserve ...

  6. 理解typename的两个含义

    理解typename的两个含义 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> ...

  7. 【JAVA零基础入门系列】Day13 Java类的继承与多态

    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...

  8. SSH服务详解

    第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Group )制定:在进行数 ...

  9. echarts2.2.7本地搭建

    1.首先下载echarts2.2.7,解压到本地,解压后的目录如下: 2.在WebContent下建立一个名为build的目录,复制echarts2.2.7下面的build下面的dist目录到ecli ...

  10. css响应式布局

    以设计稿为准,假设设计稿竖屏宽度为750px,取根元素的font-size为50px 在iphone6(375px)下,deviceWidth=7.5rem, 这个就是viewPort中的device ...