zoukankan      html  css  js  c++  java
  • PHP+Redis 实例 页面缓存

    前提分析!

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

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

    知识准备:

    • 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名之内的文章,对于超出这个数的文章,可以不用缓存。

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

    转:https://www.cnblogs.com/sunshine-H/p/7941382.html

  • 相关阅读:
    7款纯CSS3实现的炫酷动画应用
    9款基于HTML5/SVG/Canvas的折线图表应用
    8款耀眼的jQuery/HTML5焦点图滑块插件
    10款很酷的HTML5动画和实用应用 有源码
    13款精彩实用的最新jQuery插件
    9款超绚丽的HTML5/CSS3应用和动画特效
    8款最受欢迎的HTML5/CSS3应用及源码
    Zookeeper可以干什么
    MySQL数据库优化
    SQL语句的执行过程
  • 原文地址:https://www.cnblogs.com/fps2tao/p/9050001.html
Copyright © 2011-2022 走看看