对缓存的利用

       在程序代码中,有时候为了减少数据库的压力,我们会把一些比较大数据,且该数据时固定不变,这时候我们就会考虑把这些数据设置为文件缓存。一般情况下,我们会第一次查回来的数据系列化保存到文件中。并且设置好有效时间,一般情况下,我们会设置时间为10分钟。下面把一个缓存类封装好。该类主要有三个功能:设置缓存,读取缓存,删除缓存。

具体的封装好的缓存类代码Cache.php:

<?php

/**
 * 
 * 缓存类
 * @author mingyang
 * @version 
 */
class Cache
{
    protected $cachePath = ''; //文本缓存路径
    protected $cacheType = 'FILE'; //文件缓存
    protected $dataType = 'TEXT'; //文本存储
    protected $prefix = '@#$%*^JFHSH^(&*(46245';
    
    /**
     * 加载路径
     * @param unknown $path 如:product.activeorder
     */
    public static function load($path)
    {
        $path = SUN309_RESOURCE_PATH . 'cache/' . str_replace('.', '/', $path);
        return new Cache(array(
            'cachePath' => $path
        ));
    }
    
    /**
     * 
     * @param $config
     * @return unknown_type
     */
    public function __construct($config)
    {
        /*
         $config = array(
             'cacheType' => '',
             'dataType' => '',
             'cachePath' => '',
         );
         */
        
        $this->cachePath = $config['cachePath'] ? $config['cachePath'] : $this->cachePath;
        
    }
    
    /**
     * 存储
     * @param $key 缓存key
     * @param $value 缓存值,支持PHP的所有数据类型
     * @param $timeout 过期时间,-1表示执行清除缓存,单位:秒
     * @return true|false
     */
    public function set($key, $value, $timeout = null)
    {
        //删除缓存
        if($timeout === -1)
        {
            return $this->clear($key);
        }

        if(!file_exists($this->cachePath))
            mkdir($this->cachePath, 0777, 1);
            
        $folder = substr(md5($this->prefix . $key), 0, 4);
        $file = md5($this->prefix . $key) . '.log';
        $data = serialize(
            array(
                'key'     => $key,
                'value'   => $value,
                'timeout' => $timeout,
                'created' => time()
            )
        );
        
        if(!file_exists($this->cachePath . '/' . $folder))
            mkdir($this->cachePath . '/' . $folder, 0777, 1);
            
        file_put_contents($this->cachePath . '/' . $folder . '/' . $file, $data);
    }
    
    /**
     * 获取缓存
     * @param $key 缓存key
     * @return 缓存值
     */
    public function get($key)
    {
        $folder = substr(md5($this->prefix . $key), 0, 4);
        $file = md5($this->prefix . $key) . '.log';
        
        if(!file_exists($this->cachePath . '/' . $folder . '/' . $file))
            return null;
            
        $data = file_get_contents($this->cachePath . '/' . $folder . '/' . $file);
        $data = unserialize($data);
        if($data['timeout'] && (time() - $data['created'] > $data['timeout']) ) //如果设置了缓存过期时间并且已过期
            return null;
        
        return $data['value'];
    }
    
    /**
     * 清除缓存
     * @param $key
     * @return unknown_type
     */
    public function clear($key)
    {
        if(!file_exists($this->cachePath))
            return;

        $folder = substr(md5($this->prefix . $key), 0, 4);
        $file = md5($this->prefix . $key) . '.log';
        deldirfile($this->cachePath.$folder);
    }
    
    /**
     * 创建文件夹
     * @param unknown $path 绝对或相对路径
     */
    protected function makeDir($path)
    {
        $path = str_replace('\\', '/', $path);
        $arr = explode('/', $path);
        
        $p = '';
        foreach($arr as $f)
        {
            $p = $p ? $p . '/' . $f : $f;
            echo "$p <br />";
            if(!file_exists($p))
                mkdir($p);
        }
    }
}
?>

接下来是设置缓存:

<?php
include('./Cache.php');
    $cache = new Cache(array(
                    'cachePath' => 'temp/caches_reports'
            ));
    $lists=array(
        'ming'=>'yangmingyang',
        'age'=>24
    );
    $cache->set('jdin', $lists, 600); //设置缓存 单位秒

?>

读取缓存的代码:

<?php
    include('./Cache.php');
    $cache = new Cache(array(
                    'cachePath' => 'temp/caches_reports'
            ));

    $lists = $cache->get('jdin');
    echo '<pre>';
    print_r($lists);
?>

浏览器显示的结果:

Array
(
    [ming] => yangmingyang
    [age] => 24
)


你可能感兴趣的:(数据库,程序)