用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>         
时间: 2024-10-05 23:47:48

用PHP去实现数据库查询结果缓存的相关文章

ECMall的数据库查询缓存机制

刚接触Ecmall的二次开发不久,接到一个任务.很常见的任务,主要是永盈会娱乐城对数据库进行一些操作,其中查询的方法我写成这样: view source print? 01 function get_order_data($goods_id) 02 { 03     include_once("gonndb/nmdb.php"); 04     include_once("gonndb/dbinfo.php"); 05     06     $connector =

Spring AOP + Redis缓存数据库查询

应用场景 我们希望能够将数据库查询结果缓存到Redis中,这样在第二次做同样的查询时便可以直接从redis取结果,从而减少数据库读写次数. 需要解决的问题 操作缓存的代码写在哪?必须要做到与业务逻辑代码完全分离. 如何避免脏读? 从缓存中读出的数据必须与数据库中的数据一致. 如何为一个数据库查询结果生成一个唯一的标识?即通过该标识(Redis中为Key),能唯一确定一个查询结果,同一个查询结果,一定能映射到同一个key.只有这样才能保证缓存内容的正确性 如何序列化查询结果?查询结果可能是单个实体

PHP memcache 内存缓存 数据库查询 应用 高洛峰 细说PHP

PHP memcache在数据库查询中应用,减少连接数据库的次数,降低服务器的压力! /*  * memcache应用说明 memory cache 内存缓存  * 工作原理  *  服务器端口port 11211    * MemCached 存取键值对key => value  * 1.内网访问  * 2.设置防火墙  */           //创建memcache对象         $mem  =  new  Memcache();                  //连接memc

Django 的数据库查询

class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __unicode__(self): return self.name class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() def __unicode__(self

Mybatis学习记录(四)--高级查询和缓存

这些都是连贯的学习笔记,所以有的地方因为之前都说过,所以也就没怎么写详细了,看不太明白的可以看看之前的笔记. 一.高级查询 高级查询主要是一对一查询,一对多查询,多对多查询 1.一对一查询 有用户和订单两个表,用户对订单是1对1查询.也就是订单中有一个外键是指向用户的. 先创建实体类: User.java public class User { private int id; private String username; private String password; private St

第九十九天上课 PHP TP框架 数据库查询和增加

在Model文件夹下创建模型,文件命名规则 : 表名Model.class.php <?php namespace Home\Model; use Think\Model; class yonghuModel extends Model { } 实例化数据库的三种方法 //调用Model文件夹下的模型 public function shujuku1() { $yonghu=new \Home\Model\yonghuModel; //实例化自己创建的Model,(注意路径书写完整) var_d

SQLServer性能优化之 nolock,大幅提升数据库查询性能

公司数据库随着时间的增长,数据越来越多,查询速度也越来越慢.进数据库看了一下,几十万调的数据,查询起来确实很费时间. 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑.其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能. 不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read,就是读到无效的数据.

Spring+SpringMVc+Mybatis实现数据库查询

大家好,本篇博客小Y将会给大家带来一篇SSM框架实现数据查询的Demo,使用的数据库是Mysql,Server是TomCat.现在的SSM整合非常流行,因为springmvc的高效和mybatis的灵活.高效,给企业开发带来了很大的好处,大大节省了开发成本.好了,啰嗦了这么多,其实就想告诉大家ssm框架的优秀之处,那么开门见山,让我们开始本次的博客吧. 本篇博客的目录: 1:SSM框架搭建环境 2:编写数据库sql,创建表 3:连接数据库 4:写java代码,分层 5:  写jsp页面 6:Sp

提高数据库查询速度的几个思路

提高数据库查询速度的几个思路 :1.缓存,在持久层或持久层之上做缓存;2.数据库表的大字段剥离,保证单条记录的数据量很小; 3.恰当地使用索引;4.必要时建立多级索引; 5.分析Oracle的执行计划,通过表数据统计等方式协助数据库走正确的查询方式,该走索引就走索引,该走全表扫描就走全表扫描; 6.表分区和拆分,无论是业务逻辑上的拆分(如一个月一张报表.分库)还是无业务含义的分区(如根据ID取模分区);7.RAC;8.字段冗余,减少跨库查询和大表连接操作; 9.数据通过单个或多个JOB生成出来,