用PHP去实现数据库查询结果缓存
有些时候我们希望减少对数据库的查询来提高程序的性能,因为这些数据不是经常变更的,而是会在很长一段时间内都不会变化,因此,我们每连接一次数据库,都会把相应的结果用文件的形式保存起来。比如对于一个商城来说,我们的商品的数量可能会经常变,但是我们的商品类型以及商品的价格这些东西都会在很长的一段时间内不会变更,如果我们需要频繁的查询它们的时候,就可以使用数据库缓存技术。
缓存的原因
第一点首先看我们普通情况下执行一条SQL查询的开销,我们先连接数据库,然后准备SQL查询,接下来发送查询信息,然后取得返回结果,最后关闭数据库连接,这样的话会占用较多的资源,而我们的PHP程序也因为要等待从数据库中查询而使得响应速度变慢。
第二点就是在数据库压力较大时,比如高峰时段,这个时候数据库压力大,我们就需要把一些数据存储到硬盘上,用文件的形式去读取,这样的做法是用我们的硬盘空间换取数据库的压力,这一点也要看机器性能。
第三点就是有些数据不着急去更新,比如上面提到的商品类型表,就不会太急于更新,比如我们的用户的核心信息,一般也不会轻易去修改密码什么的,这些内容可以选择用文件的形式去缓存起来。
缓存的实现原理
第一点就是我们要确定何时强制更新内容,最常见的有三种方式就是第一个就是用时间去触发,我们通常使用时间戳,第二点就是发现数据库数据被修改,则自动更新缓存,第三个就是人工触发,我们用人工的防水告诉信息系统强制更新缓存内容。
第二点就是我们可以通过使用serialize()函数来把从数据库中取得的数据进行序列化,保存为本地文件,然后我们通过unserialize来从本地文件中读取信息,所谓序列化就是用特定的方式去存储PHP的值,它会保证部丢失这些值的类型和结构。
实战演示
我们首先把从数据库中读取的数据存入本地文件,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--?php
//第一步连接数据库
$conn = mysqli_connect("localhost","root","","bbs");
//第二步设置相应的字符编码
$setting = 'set names utf8';
mysqli_query($conn,$setting);
//第三步进行查询
$sql = 'SELECT * FROM user';
$result = mysqli_query($conn,$sql);
//第四步把查询结果转化为一个数组
$rows = mysqli_num_rows($result);
$sqldata = array();
for($i = 0;$i <$rows;$i ++){
$sqldata[] = mysqli_fetch_assoc($result);
}
//第五步把结果写到缓存文件
$file = "sqlcache.txt";
$msg = serialize($sqldata);
$fp = fopen($file,"w");
fputs($fp,$msg);
fclose($fp);
然后我们可以打开这个sqlcache.txt文件,它的内容如下:
a:6:{i:0;a:4:{s:2:"id";s:1:"1";s:5:"level";s:1:"0";s:4:"name";s:6:"辛星";s:3:"pwd";s:32:"bd04fcc97578ce33ca5fb331f42bc375";}i:1;a:4:{s:2:"id";s:1:"2";s:5:"level";s:1:"1";s:4:"name";s:6:"小倩";s:3:"pwd";s:32:"61cb72858be523b9926ecc3d7da5d0c6";}i:2;a:4:{s:2:"id";s:1:"3";s:5:"level";s:1:"1";s:4:"name";s:6:"小楠";s:3:"pwd";s:32:"a3d2de7675556553a5f08e4c88d2c228";}i:3;a:4:{s:2:"id";s:1:"4";s:5:"level";s:1:"1";s:4:"name";s:6:"刘强";s:3:"pwd";s:32:"fcdb06a72af0516502e5fdccc9181ee0";}i:4;a:4:{s:2:"id";s:1:"5";s:5:"level";s:1:"1";s:4:"name";s:6:"星哥";s:3:"pwd";s:32:"866a6cafcf74ab3c2612a85626f1c706";}i:5;a:4:{s:2:"id";s:1:"6";s:5:"level";s:1:"1";s:4:"name";s:6:"辛勇";s:3:"pwd";s:32:"e93beb7663f3320eaa0157730d02dd0c";}}
然后我们可以写一个程序从该文件中读取数据,PHP代码如下:
<!--?php
$file = "sqlcache.txt";
$msg = file_get_contents($file);
$result = unserialize($msg);
var_dump($result);
</pre--><p></p>
<p>这样我们的$result就是从本地的txt文件中读取的数据,而不是从数据库中读取的数据了,即我们模拟了缓存的使用。</p>
<p><br>
</p>
<p>说明:</p>
<p>1.我们通过filemtime来得到文件的创建时间,可以用time来得到现在的时间,通过比较这个差值来决定是否要更新缓存。</p>
<p>2.我们可以用unlink来强制的删除文件以清空数据缓存</p>
<p><br>
</p>
<p><br>
</p>
<br>
<p><br>
</p>
用PHP去实现数据库查询结果缓存的更多相关文章
- kettle 表输入+流查询 与 数据库查询
他们的主要区别: •流查询步骤只能进行等值查询,数据库查询步骤可以进行非等值查询 •流查询在查询之前把数据都加载到内存里,数据库查询可以选择是否把数据加载到内存. •进行等值查询时,数据库查询步骤如果 ...
- mysql数据库查询缓存总结
概述 查询缓存(Query Cache,简称QC),存储SELECT语句及其产生的数据结果.闲来无事,做一下这块的总结,也做个备忘! 工作原理 查询缓存工作原理如下: 缓存SELECT操作的结果集和S ...
- 继上篇-jquery ajax提交 本篇用ajax提交的数据去数据库查询
上篇讲到如何用jquery ajax提交数据至后台,后台接收并返回给ajax.https://www.cnblogs.com/tiezhuxiong/p/11943328.html 今天我们把数据传到 ...
- Django 的数据库查询
class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def _ ...
- 数据库查询服务DBCacheServer
各个业务系统,都需要查询各类数据库; 一般查询数据库都是客户端自己连接,根据现在的情况,存在以下几点问题 1.客户端连接很多,连接大小,峰值不可控 2.客户端SQL程序员自己写,参差不齐 3.SQL书 ...
- [转载]Hibernate如何提升数据库查询的性能
目录(?)[-] 数据库查询性能的提升也是涉及到开发中的各个阶段在开发中选用正确的查询方法无疑是最基础也最简单的 SQL语句的优化 使用正确的查询方法 使用正确的抓取策略 Hibernate的性能优化 ...
- Redis(1.8)Redis与mysql的数据库同步(缓存穿透与缓存雪崩)
[1]缓存穿透与缓存雪崩 [1.1]缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的 ...
- mysql数据库查询过程探究和优化建议
查询过程探究 我们先看一下向mysql发送一个查询请求时,mysql做了什么? 如上图所示,查询执行的过程大概可分为6个步骤: 客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,如果命 ...
- Python中的Django框架中prefetch_related()函数对数据库查询的优化
实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
随机推荐
- Doves and bombs UVA - 10765(统计割顶所连接的连通块的数量)
题意:给定一个n个点的连通的无向图,一个点的“鸽子值”定义为将它从图中删去后连通块的个数. 求对应的点 和 每个点的“鸽子值” 用一个数组在判断割顶的那个地方 累加标记一下所连接的连通块的数量即可 初 ...
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- 【Python简介】
一.Python的简介 1.什么是python? Python(发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用 ...
- [POJ1094] Sorting It All Out
link 题目大意 给出$m$个不等式关系,问可以从第几个开始确定所有之间的大小关系.若无解请输出是无法确定还是与已知矛盾. 试题分析 这题是真的是坑啊,尽然放在$floyd$传到闭包上面,还用二分, ...
- javascript和bigint
http://note.youdao.com/noteshare?id=91e21eb1d8c20025d72d7ee6f401e34d
- 用for语句从数组中剔除数据,注意,count,要放到for语句之外才行
date_default_timezone_set('Asia/Shanghai'); $arr = array( ,), ,), ,), ,) ); print_r($arr); ;$i<co ...
- ubuntu环境下添加中文输入法
1.下载软件包 打开终端,输入命令 sudo apt-get install fcitx-table-wbpy 2.打开 system settings-> language support-& ...
- Codechef Observing the Tree
Home » Practice(Hard) » Observing the Tree https://www.codechef.com/problems/QUERY Observing the T ...
- Atcoder #017 agc017 A.Biscuits 简单数学
LINK 题意:水题 求取数,使得和为奇数或偶数的方案数. 思路:统计奇数和偶数,组合求一下发现结果就是$2^{odd-1} + 2^{eve-1}$ 注意特殊情况,即奇数个为0又要求和为奇数的方案数 ...
- CF767 A. Snacktower 暴力
LINK 题意:给出一个序列,如果存的数满足连续递减(第一个必须为n)则输出否则输出空行,并暂存当前数 思路:直接暴力不可行,由于待输出的数的个数满足单调性可以稍微优化,即从上一回输出的最小一个数开始 ...