首页 理论教育实战教程:PHPMVC开发缓存数据集

实战教程:PHPMVC开发缓存数据集

【摘要】:将数据全部缓存到Memcached之后,程序在获取数据时并不直接连接数据库,而是连接缓存服务器。服务器关机后,内存中的数据也将会被清空,所以尽量搭建可容灾的Memcached服务器集群。

在ThinkPHP中,缓存数据集是最常用及最有意义的一项操作,因为系统内置了非常智能化编译及缓存机制,数据表字段、SQL语句等在非调试模式下会自动进行缓存,所以开发人员不需要手动处理。缓存数据集能够避免相同数据多次读取数据库,从而提高查询效率

通常情况下,数据集是由多条记录组成的,所以只需要将一条记录作为一条Memcached数据项,就可以有效改善查询速度;如果数据量比较小,可以一次性将整个数据集进行缓存。缓存数据集,可分为3种模式,下面分别介绍。

1.缓存数据集字段

缓存数据集字段是效率最高、也是Memcached最常使用的一种缓存模式。缓存数据集,只需要在第一次返回结果时,将其中没有创建索引,或者数据量比较大的字段(例如text、varchar字段等)缓存到Memcached中,用户再次查询相同的数据时,系统将直接输出已经缓存过的字段值,避免再次查询数据库。如以下代码所示。

上述代码中,将title及content字段值使用Memcached缓存为一个独立项,再次查询title及content字段时,系统将不会从tpk_article数据表获取,而是直接在缓存系统中获取,很好地提高了效率。

不仅如此,由于缓存系统是全局性的,这也就意味着缓存系统中的数据可以在网站内任何地方调用。根据这个原理,在单击文章详情时,只需要输出Memcachd中的缓存即可,而不需要查询数据表。如以下代码所示。

如上述代码所示,在文章详细页面中,根据GET传递参数判断缓存系统是否存在相应的数据,如果存在,则直接返回数据,不再操作数据库。经过上述处理,数据查询速度将得到质的提升。

2.缓存数组集结果

如果数据集返回的数据量比较小,可以将全部结果缓存到Memcached中,这样做的好处是可以提高开发效率,同时也能够提高查询速度。但也有缺点,如果返回的数据量突然增多,甚至超过Memcache的容量,那么数据集将会丢失数据,造成系统运行异常。

同时需要注意,缓存整个数据集必须要将结果进行序列化(要确保获取时能够完美反序列化),常用的序列化函数有json_encode、sizeo、base64_encode等。缓存数据集相对比较简单,只需要创建缓存Key即可,如以下代码所示。

上述代码使用到了分页扩展,这里只需要理解即可,后面将会有详细介绍。一个数据集就相当于一个页面中的数据循环体,根据分页号唯一性的特点,可以直接使用分页号作为Memcached缓存主键,在获取数据时,一条Memcached数据项就是一个数据集。(www.chuimin.cn)

3.缓存整个数据表

缓存整个数据表是减轻数据库查询压力最有效的方法,但同时也是最消耗内存的一种缓存方式。同时,由于在缓存时需要全部读取数据表中的数据,然后执行缓存操作。在这一过程中,将会占用服务器的大量资源(主要是内存及CPU)。

将数据全部缓存到Memcached之后,程序在获取数据时并不直接连接数据库,而是连接缓存服务器。在查询时,只能根据缓存主键(例如ID)查询数据,并且只支持一个字段。这样一来数据库操作将失去原有的灵活性,所以在此并不建议使用这种模式缓存数据。但如果确实需要,建议使用以下几种手段解决上述提到的问题。

➢创建缓存时,需要在访问量较少的时间段内进行,可以配合计划任务实现。但更通用的办法是在网站后台中,由管理员手动生成缓存。

➢由于Memcached是一个内存数据库,所以Memcached所在的服务器内存必须要足够大。服务器关机后,内存中的数据也将会被清空,所以尽量搭建可容灾的Memcached服务器集群。

➢充分使用Memcached内置的zlib压缩功能。

下面通过一段简单的示例代码,演示缓存数据表数据的过程,代码并不完善,在真实应用开发中还需要读者继续完善,代码如下所示。

生成缓存后,只需要根据cache_id进行获取即可,如以下代码所示。

上述代码使用for区间批量获取,读者可以根据前面介绍的第2种缓存模式获取单条缓存数据。