TimoPHP接入Redis数据库,缓存、队列、集合、数据存储的运用

 


 

增加Redis数据库配置

配置位置

 

/config/db.config.php

 

配置内容

 

'redis' => [
        'cache' => [
            'host' => '127.0.0.1',
            'port' => 6379,
            'auth' => '',
            'pass' => '',
            'timeout' => 0,
            'db' => 6
        ],
        'queue' => [
            'host' => '127.0.0.1',
            'port' => 6379,
            'auth' => '',
            'pass' => '',
            'timeout' => 5,
            'db' => 7
        ]
    ]

 

说明:redis分为16个库,cache、queue这些都是一个库,分别对应我们设置的db这个字段,
如cache的db是6,那么cache就是redis里面的第6个库,这个是自定义的
这里只是举例,需要多少个库自己按照这个例子来配置即可

 

实例化Redis的例子

 

一般我们是在Model里面操作redis,比如选择一个公共的Module,如:WebModel、CommonModel
其它Model继承WebModel

 

<?php
namespace modules\web;


use Timo\Core\Config;
use Timo\Core\Exception;
use Timo\Core\Model;

/**
 * Class WebModel
 * @package modules\web
 * @property \Redis rank
 * @property \Redis cache
 * @property \Redis store
 * @property \Redis queue
 */
class WebModel extends Model
{
    /**
     * 获取缓存key配置
     *
     * @param $config_name
     * @param array ...$key
     * @return string
     * @throws Exception
     */
    protected function getCacheKey($config_name, ...$key)
    {
        static $config = null;
        if (null === $config) {
            $config = Config::load(Config::load('runtime')->get('config', 'path') . 'cache_key.config.php');
        }

        $cache_key = $config->get($config_name);
        if (!$cache_key) {
            throw new Exception("未定义的缓存key: {$config_name}");
        }

        if (!empty($key)) {
            return sprintf('%s:%s', $cache_key, implode(':', $key));
        }

        return $cache_key;
    }

    /**
     * @param $dbType
     * @param $dbName
     * @return \Redis
     */
    private function getModel($dbType, $dbName)
    {
        $config = Config::load('runtime')->get($dbType, $dbName);
        $redis = new \Redis();
        $redis->connect($config['host'], $config['port'], $config['timeout']);
        $redis->select($config['db']);
        return $redis;
    }

    /**
     * @param $property
     * @return bool|mixed|\Redis
     */
    function __get($property)
    {
        static $map = array();
        if (isset($map[$property])) {
            return $this->$property = $map[$property];
        }

        switch ($property) {

            case 'cache' :
                return $this->cache = $map[$property] = $this->getModel('redis', 'cache');

            case 'queue' :
                return $this->queue = $map[$property] = $this->getModel('redis', 'queue');

            case 'store' :
                return $this->store = $map[$property] = $this->getModel('redis', 'store');

            default :
                return false;
        }
    }
}

 

缓存key管理

 

一般我们会把缓存的key统一管理,放在一个缓存文件里面,如:/config/cache_key.config.php
比如下面:

 

<?php
return array(
    /**
     * db6 缓存数据库
     */
    'recentComicData' => 'd:rcd',  //最近更新数据

    /**
     * db7 队列数据库
     */

    /**
     * db8 存储数据库
     */
);

 

开始使用

 

比如我们建立一个教程model CourseModel,继承WebModule,然后,我们在model里面就可以使用了
$this->cache 就代表使用redis的第6个库
$this->queue 就代表使用redis的第7个库
$this->store 就代表使用redis的第8个库
这些都是上面自定义的,使用的话都是redis原生用法

关于redis的用法请参考 https://github.com/phpredis/phpredis

 

<?php
namespace modules\course;

user modules\web\UserModule;

class CourseModel extends WebModule
{
    public function getCourse($course_id)
    {
        $cache_key = $this->getCacheKey('AticleDetail', $course_id);
        
        $data = $this->cache->get($cache_key);
        
        if (!$data) {
            $data = $this->get($course_id);
            $this->cache->set($cache_key, $data);
        }
        
        return $data;
    }
}