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;
}
}