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


增加Redis数据库配置

配置位置

/config/db.config.php

配置内容

  1. 'redis' => [
  2. 'cache' => [
  3. 'host' => '127.0.0.1',
  4. 'port' => 6379,
  5. 'auth' => '',
  6. 'pass' => '',
  7. 'timeout' => 0,
  8. 'db' => 6
  9. ],
  10. 'queue' => [
  11. 'host' => '127.0.0.1',
  12. 'port' => 6379,
  13. 'auth' => '',
  14. 'pass' => '',
  15. 'timeout' => 5,
  16. 'db' => 7
  17. ]
  18. ]

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

实例化Redis的例子

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

  1. <?php
  2. namespace modules\web;
  3. use Timo\Core\Config;
  4. use Timo\Core\Exception;
  5. use Timo\Core\Model;
  6. /**
  7. * Class WebModel
  8. * @package modules\web
  9. * @property \Redis rank
  10. * @property \Redis cache
  11. * @property \Redis store
  12. * @property \Redis queue
  13. */
  14. class WebModel extends Model
  15. {
  16. /**
  17. * 获取缓存key配置
  18. *
  19. * @param $config_name
  20. * @param array ...$key
  21. * @return string
  22. * @throws Exception
  23. */
  24. protected function getCacheKey($config_name, ...$key)
  25. {
  26. static $config = null;
  27. if (null === $config) {
  28. $config = Config::load(Config::load('runtime')->get('config', 'path') . 'cache_key.config.php');
  29. }
  30. $cache_key = $config->get($config_name);
  31. if (!$cache_key) {
  32. throw new Exception("未定义的缓存key: {$config_name}");
  33. }
  34. if (!empty($key)) {
  35. return sprintf('%s:%s', $cache_key, implode(':', $key));
  36. }
  37. return $cache_key;
  38. }
  39. /**
  40. * @param $dbType
  41. * @param $dbName
  42. * @return \Redis
  43. */
  44. private function getModel($dbType, $dbName)
  45. {
  46. $config = Config::load('runtime')->get($dbType, $dbName);
  47. $redis = new \Redis();
  48. $redis->connect($config['host'], $config['port'], $config['timeout']);
  49. $redis->select($config['db']);
  50. return $redis;
  51. }
  52. /**
  53. * @param $property
  54. * @return bool|mixed|\Redis
  55. */
  56. function __get($property)
  57. {
  58. static $map = array();
  59. if (isset($map[$property])) {
  60. return $this->$property = $map[$property];
  61. }
  62. switch ($property) {
  63. case 'cache' :
  64. return $this->cache = $map[$property] = $this->getModel('redis', 'cache');
  65. case 'queue' :
  66. return $this->queue = $map[$property] = $this->getModel('redis', 'queue');
  67. case 'store' :
  68. return $this->store = $map[$property] = $this->getModel('redis', 'store');
  69. default :
  70. return false;
  71. }
  72. }
  73. }

缓存key管理

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

比如下面:

  1. <?php
  2. return array(
  3. /**
  4. * db6 缓存数据库
  5. */
  6. 'recentComicData' => 'd:rcd', //最近更新数据
  7. /**
  8. * db7 队列数据库
  9. */
  10. /**
  11. * db8 存储数据库
  12. */
  13. );

开始使用

比如我们建立一个教程model CourseModel,继承WebModule,然后,我们在model里面就可以使用了

  • $this->cache 就代表使用redis的第6个库
  • $this->queue 就代表使用redis的第7个库
  • $this->store 就代表使用redis的第8个库

这些都是上面自定义的,使用的话都是redis原生用法

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

  1. <?php
  2. namespace modules\course;
  3. user modules\web\UserModule;
  4. class CourseModel extends WebModule
  5. {
  6. public function getCourse($course_id)
  7. {
  8. $cache_key = $this->getCacheKey('AticleDetail', $course_id);
  9. $data = $this->cache->get($cache_key);
  10. if (!$data) {
  11. $data = $this->get($course_id);
  12. $this->cache->set($cache_key, $data);
  13. }
  14. return $data;
  15. }
  16. }