summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Lindqvist <anton@qvister.se>2012-01-21 12:25:08 +0100
committerAnton Lindqvist <anton@qvister.se>2012-01-21 12:25:08 +0100
commit1e8be299b1c0f6385fb0536a6983147bd8ac029e (patch)
tree68946ea89ce54969753a3bb13739fffe09ce4613
parent96db8f91c34c18119548cacc4692362f51e70407 (diff)
Added redis cache driver.
-rw-r--r--application/controllers/test_redis.php43
-rw-r--r--system/libraries/Cache/Cache.php2
-rw-r--r--system/libraries/Cache/drivers/Cache_redis.php217
3 files changed, 261 insertions, 1 deletions
diff --git a/application/controllers/test_redis.php b/application/controllers/test_redis.php
new file mode 100644
index 000000000..b84c652d7
--- /dev/null
+++ b/application/controllers/test_redis.php
@@ -0,0 +1,43 @@
+<?php
+class Test_redis extends CI_Controller
+{
+
+ function __construct()
+ {
+ parent::__construct();
+
+ $this->load->library('unit_test');
+
+ $this->load->driver('cache', array('adapter' => 'redis'));
+ }
+
+ function index()
+ {
+ $this->unit->run($this->cache->redis->is_supported(), 'is_true');
+
+ $this->unit->run($this->cache->redis->save('foo', 'bar'), 'is_true');
+
+ $this->unit->run($this->cache->redis->get('foo'), 'bar');
+
+ $this->unit->run($this->cache->redis->delete('foo'), 'is_true');
+
+ $this->unit->run($this->cache->redis->save('foo', 'bar', 1800), 'is_true');
+
+ $this->unit->run(
+ $this->cache->redis->get_metadata('foo'),
+ array(
+ 'data' => 'bar',
+ 'expire' => time() + 1800
+ )
+ );
+
+ $this->unit->run($this->cache->redis->clean(), 'is_true');
+
+ $this->unit->run($this->cache->redis->get('foo'), 'is_false');
+
+ $this->unit->run($this->cache->redis->cache_info(), 'is_array');
+
+ echo $this->unit->report();
+ }
+
+} \ No newline at end of file
diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php
index 2e78a6660..25555506c 100644
--- a/system/libraries/Cache/Cache.php
+++ b/system/libraries/Cache/Cache.php
@@ -39,7 +39,7 @@
class CI_Cache extends CI_Driver_Library {
protected $valid_drivers = array(
- 'cache_apc', 'cache_file', 'cache_memcached', 'cache_dummy'
+ 'cache_apc', 'cache_file', 'cache_memcached', 'cache_redis', 'cache_dummy'
);
protected $_cache_path = NULL; // Path of cache files (if file-based cache)
diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php
new file mode 100644
index 000000000..9eb7a8d4e
--- /dev/null
+++ b/system/libraries/Cache/drivers/Cache_redis.php
@@ -0,0 +1,217 @@
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 5.1.6 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 2.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Redis Caching Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Core
+ * @author Anton Lindqvist <anton@qvister.se>
+ * @link
+ */
+class CI_Cache_redis extends CI_Driver
+{
+
+ /**
+ * Default config
+ *
+ * @access private
+ * @static
+ * @var array
+ */
+ private static $_default_config = array(
+ 'host' => '127.0.0.1',
+ 'port' => 6379,
+ 'timeout' => 0
+ );
+
+ /**
+ * Redis connection
+ *
+ * @access private
+ * @var Redis
+ */
+ private $_redis;
+
+ /**
+ * Class destructor
+ *
+ * Closes the connection to Redis if present.
+ *
+ * @access public
+ * @return void
+ */
+ public function __destruct()
+ {
+ if ($this->_redis)
+ {
+ $this->_redis->close();
+ }
+ }
+
+ /**
+ * Get cache
+ *
+ * @access public
+ * @param string $key Cache key identifier
+ * @return mixed
+ */
+ public function get($key)
+ {
+ return $this->_redis->get($key);
+ }
+
+ /**
+ * Save cache
+ *
+ * @access public
+ * @param string $key Cache key identifier
+ * @param mixed $value Data to save
+ * @param integer $ttl Time to live
+ * @return boolean
+ */
+ public function save($key, $value, $ttl = NULL)
+ {
+ return ($ttl)
+ ? $this->_redis->setex($key, $ttl, $value)
+ : $this->_redis->set($key, $value);
+ }
+
+ /**
+ * Delete from cache
+ *
+ * @access public
+ * @param string $key Cache key
+ * @return boolean
+ */
+ public function delete($key)
+ {
+ return ($this->_redis->delete($key) === 1);
+ }
+
+ /**
+ * Clean cache
+ *
+ * @access public
+ * @return boolean
+ * @see Redis::flushDB()
+ */
+ public function clean()
+ {
+ return $this->_redis->flushDB();
+ }
+
+ /**
+ * Get cache driver info
+ *
+ * @access public
+ * @param string $type Not supported in Redis. Only included in order to offer a
+ * consistent cache API.
+ * @return array
+ * @see Redis::info()
+ */
+ public function cache_info($type = NULL)
+ {
+ return $this->_redis->info();
+ }
+
+ /**
+ * Get cache metadata
+ *
+ * @access public
+ * @param string $key Cache key
+ * @return array
+ */
+ public function get_metadata($key)
+ {
+ $value = $this->get($key);
+
+ if ($value)
+ {
+ return array(
+ 'expire' => time() + $this->_redis->ttl($key),
+ 'data' => $value
+ );
+ }
+ }
+
+ /**
+ * Check if Redis driver is supported
+ *
+ * @access public
+ * @return boolean
+ */
+ public function is_supported()
+ {
+ if (extension_loaded('redis'))
+ {
+ $this->_setup_redis();
+
+ return TRUE;
+ }
+ else
+ {
+ log_message(
+ 'error',
+ 'The Redis extension must be loaded to use Redis cache.'
+ );
+
+ return FALSE;
+ }
+
+ }
+
+ /**
+ * Setup Redis config and connection
+ *
+ * Loads Redis config file if present. Will halt execution if a Redis connection
+ * can't be established.
+ *
+ * @access private
+ * @return void
+ * @see Redis::connect()
+ */
+ private function _setup_redis()
+ {
+ $config = array();
+ $CI =& get_instance();
+
+ if ($CI->config->load('redis', TRUE, TRUE))
+ {
+ $config += $CI->config->item('redis');
+ }
+
+ $config = array_merge(self::$_default_config, $config);
+
+ $this->_redis = new Redis();
+
+ try
+ {
+ $this->_redis->connect($config['host'], $config['port'], $config['timeout']);
+ }
+ catch (RedisException $e)
+ {
+ show_error('Redis connection refused. ' . $e->getMessage());
+ }
+ }
+
+}
+// End Class
+
+/* End of file Cache_redis.php */
+/* Location: ./system/libraries/Cache/drivers/Cache_redis.php */ \ No newline at end of file