Add Redis Cache driver

This commit is contained in:
Timothy Warren 2016-04-08 14:25:45 -04:00
parent 52c1cff5e8
commit ea1b63265b
9 changed files with 183 additions and 44 deletions

View File

@ -14,7 +14,7 @@ show_anime_collection = true
# do you wish to show the manga collection? # do you wish to show the manga collection?
show_manga_collection = false show_manga_collection = false
# cache driver for api calls (SQLDriver, RedisDriver, MemcacheDriver) # cache driver for api calls (SQLDriver, RedisDriver)
cache_driver = SQLDriver cache_driver = SQLDriver
# path to public directory on the server # path to public directory on the server

View File

@ -0,0 +1,15 @@
################################################################################
# Redis Cache Configuration #
################################################################################
# Host or socket to connect to
host = "127.0.0.1"
# Connection port
#port = 6379
# Connection password
#password = ""
# Database number
database = 13

View File

@ -55,10 +55,11 @@ class AnimeCollection extends DB {
// Is database valid? If not, set a flag so the // Is database valid? If not, set a flag so the
// app can be run without a valid database // app can be run without a valid database
$db_file_name = $this->db_config['collection']['file']; if ($this->db_config['collection']['type'] === 'sqlite')
if ($db_file_name !== ':memory:')
{ {
if (file_exists($db_file_name)) $db_file_name = $this->db_config['collection']['file'];
if ($db_file_name !== ':memory:' && file_exists($db_file_name))
{ {
$db_file = file_get_contents($db_file_name); $db_file = file_get_contents($db_file_name);
$this->valid_database = (strpos($db_file, 'SQLite format 3') === 0); $this->valid_database = (strpos($db_file, 'SQLite format 3') === 0);

View File

@ -4,10 +4,10 @@
* *
* Building blocks for web development * Building blocks for web development
* *
* @package Ion * @package Ion
* @author Timothy J. Warren * @author Timothy J. Warren
* @copyright Copyright (c) 2015 - 2016 * @copyright Copyright (c) 2015 - 2016
* @license MIT * @license MIT
*/ */
namespace Aviat\Ion\Cache; namespace Aviat\Ion\Cache;
@ -16,36 +16,36 @@ namespace Aviat\Ion\Cache;
* Interface for cache drivers * Interface for cache drivers
*/ */
interface CacheDriverInterface { interface CacheDriverInterface {
/** /**
* Retreive a value from the cache backend * Retreive a value from the cache backend
* *
* @param string $key * @param string $key
* @return mixed * @return mixed
*/ */
public function get($key); public function get($key);
/** /**
* Set a cached value * Set a cached value
* *
* @param string $key * @param string $key
* @param mixed $value * @param mixed $value
* @return CacheDriverInterface * @return CacheDriverInterface
*/ */
public function set($key, $value); public function set($key, $value);
/** /**
* Invalidate a cached value * Invalidate a cached value
* *
* @param string $key * @param string $key
* @return CacheDriverInterface * @return CacheDriverInterface
*/ */
public function invalidate($key); public function invalidate($key);
/** /**
* Clear the contents of the cache * Clear the contents of the cache
* *
* @return void * @return void
*/ */
public function invalidateAll(); public function invalidateAll();
} }
// End of CacheDriverInterface.php // End of CacheDriverInterface.php

View File

@ -0,0 +1,108 @@
<?php
/**
* Ion
*
* Building blocks for web development
*
* @package Ion
* @author Timothy J. Warren
* @copyright Copyright (c) 2015 - 2016
* @license MIT
*/
namespace Aviat\Ion\Cache\Driver;
use Aviat\Ion\Di\ContainerInterface;
class RedisDriver implements \Aviat\Ion\Cache\CacheDriverInterface {
/**
* The redis extension class instance
* #var Redis
*/
protected $redis;
/**
* Create the Redis cache driver
*/
public function __construct(ContainerInterface $container)
{
$config = $container->get('config');
$redisConfig = $config->get('redis');
$this->redis = new \Redis();
(array_key_exists('port', $redisConfig))
? $this->redis->pconnect($redisConfig['host'], $redisConfig['port'])
: $this->redis->pconnect($redisConfig['host']);
// If there is a password, authorize
if (array_key_exists('password', $redisConfig))
{
$this->redis->auth($redisConfig['password']);
}
// If there is a database selected, connect to the specified database
if (array_key_exists('database', $redisConfig))
{
$this->redis->select($redisConfig['database']);
}
$this->redis->setOption(\Redis::OPT_SERIALIZER, \Redis::SERIALIZER_PHP);
}
/**
* Destructor to disconnect from redis
*/
public function __destruct()
{
$this->redis->close();
}
/**
* Retreive a value from the cache backend
*
* @param string $key
* @return mixed
*/
public function get($key)
{
return $this->redis->get($key);
}
/**
* Set a cached value
*
* @param string $key
* @param mixed $value
* @return CacheDriverInterface
*/
public function set($key, $value)
{
$this->redis->set($key, $value);
return $this;
}
/**
* Invalidate a cached value
*
* @param string $key
* @return CacheDriverInterface
*/
public function invalidate($key)
{
$this->redis->del($key);
return $this;
}
/**
* Clear the contents of the cache
*
* @return void
*/
public function invalidateAll()
{
$this->redis->flushDB();
}
}
// End of RedisDriver.php

View File

@ -72,14 +72,7 @@ class SQLDriver extends DB implements \Aviat\Ion\Cache\CacheDriverInterface {
'value' => serialize($value), 'value' => serialize($value),
]); ]);
/*if ( ! empty($this->get($key))) $this->db->insert('cache');
{
$this->db->update('cache');
}
else*/
{
$this->db->insert('cache');
}
return $this; return $this;
} }

View File

@ -71,6 +71,10 @@ class AnimeClient_TestCase extends PHPUnit_Framework_TestCase {
'routes' => [ 'routes' => [
] ]
],
'redis' => [
'host' => 'localhost',
'database' => 13
] ]
]; ];

View File

@ -0,0 +1,18 @@
<?php
require_once('CacheDriverBase.php');
use Aviat\Ion\Friend;
use Aviat\Ion\Cache\Driver\RedisDriver;
class CacheRedisDriverTest extends AnimeClient_TestCase {
use CacheDriverBase;
protected $driver;
public function setUp()
{
parent::setUp();
$this->driver = new RedisDriver($this->container);
}
}

View File

@ -1,6 +1,6 @@
<?php <?php
require('CacheDriverBase.php'); require_once('CacheDriverBase.php');
use Aviat\Ion\Friend; use Aviat\Ion\Friend;
use Aviat\Ion\Cache\Driver\SQLDriver; use Aviat\Ion\Cache\Driver\SQLDriver;