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
PHP+Redis 实例 页面缓存的更多相关文章
- Django + Redis实现页面缓存
目的:把从数据库读出的数据存入的redis 中既提高了效率,又减少了对数据库的读写,提高用户体验. 例如: 1,同一页面局部缓存,局部动态 from django.views import View ...
- springboot和redis处理页面缓存
页面缓存是应对高并发的一个比较常见的方案,当请求页面的时候,会先查询redis缓存中是否存在,若存在则直接从缓存中返回页面,否则会通过代码逻辑去渲染页面,并将渲染后的页面缓存到redis中,然后返回. ...
- PHP程序连接多个redis实例做缓存
1.redis配置: $CONFIG_REDIS = array( array('host' => '192.168.19.29', 'port' => '6379', 'dbIn ...
- PHP+Redis 实例【二】页面缓存 新玩法
今天算是认识到博客园里的审查团队多内幕了,哈哈,贴个图玩下. 气死宝宝了. 进入主题! 今天就不写什么功能性的了,换下口味说下关于页面级的缓存,应该怎么做. 相信有很多小伙伴查了百度,甚至google ...
- 【最全 干货 实例】 缓存手册(Memcached、redis、RabbitMQ)
http://www.cnblogs.com/suoning/p/5807247.html 本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 re ...
- ASP.NET 页面缓存OutputCache用法实例(附ab压力测试对比图)
本文主要介绍Web窗体页面中的使用方法,MVC中使用方法,大家自行百度. 一.简单一行指令即可实现 <%@ OutputCache VaryByParam=" %> 这样整个页面 ...
- 在AspNetCore 中 使用Redis实现分布式缓存
AspNetCore 使用Redis实现分布式缓存 上一篇讲到了,Core的内置缓存:IMemoryCache,以及缓存的基础概念.本篇会进行一些概念上的补充. 本篇我们记录的内容是怎么在Core中使 ...
- 【转】Nginx学习---Nginx&&Redis&&hcache三层缓存架构总结
[原文]https://www.toutiao.com/i6594307974817120782/ 摘要: 对于高并发架构,毫无疑问缓存是最重要的一环,对于大量的高并发,可以采用三层缓存架构来实现,n ...
- 在AspNetCore 中 使用Redis实现分布式缓存 (转载)
文章概念描述 分布式缓存描述:分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分布式开发,分布式部署,分布式锁.事物.系统 等有很多.使我们对分布式本身就有一个很明确的认识,分布式就是有 ...
随机推荐
- LCA+差分【CF191C】Fools and Roads
Description 有一颗 \(n\) 个节点的树,\(k\) 次旅行,问每一条边被走过的次数. Input 第一行一个整数 \(n\) (\(2\leq n\leq 10^5\)). 接下来 \ ...
- 51nod 更难的矩阵取数问题(动态规划)
更难的矩阵取数问题 给定一个m行n列的矩阵,矩阵每个元素是一个正整数,你现在 在左上角(第一行第一列),你需要走到右下角(第m行,第n列),每次只能朝右或者下走到相邻的位置,不能走出矩阵.然后再从右下 ...
- hihocoder1067 最近公共祖先·二(tarjin算法)(并查集)
#1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站 ...
- 【找规律】URAL - 2065 - Different Sums
就让0出现得尽可能多嘛……大概感受一下就是这样…… 0 0 ... 0 0 0 0 4 -4 3 -3 2 -2 1 -1 #include<cstdio> using namespace ...
- 【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串
二分答案,然后搞出hash值扔到哈希表里.期望复杂度O(n*log(n)). <法一>next数组版哈希表 #include<cstdio> #include<cstri ...
- 前端基础-JavaScript的基本概述和语法
1.JavaScript概述 2.JavaScript引入方式 3.JavaScript语言规范 4.JavaScript语言基础 5.JavaScript数据类型 6.JavaScript运算符 7 ...
- 1.1(Spring MVC学习笔记)初识SpringMVC及SpringMVC流程
一.Spring MVC Spring MVC是Spring提供的一个实现了web MVC设计模式的轻量级Web框架. Spring优点:网上有,此处不复述. 二.第一个Spring MVC 2.1首 ...
- Exercise01_11
public class Population{ public static void main(String[] args){ int sum,s; s=365*5*24*60*60; sum=31 ...
- MSGPACK序列和还原TFDParams
MSGPACK序列和还原TFDParams unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, S ...
- oracle审计AUD$过大导致的数据库登录异常
今天,省分技术人员反映数据库登录异常. 查询oerr,发现该错误是一般性提示,可能导致的原因有数据库未注册.本地文件配置问题等.由于平时连接并没有问题,是突发情况,所以排除了配置问题. 远程登录查 ...