diff options
author | Andrey Andreev <narf@devilix.net> | 2014-08-18 14:57:40 +0200 |
---|---|---|
committer | Andrey Andreev <narf@devilix.net> | 2014-08-18 14:57:40 +0200 |
commit | 5e9b936390f0b72ee899985bd21204b50a7c917e (patch) | |
tree | 899d7c109c297a56cc90a4b324dfcdd27522ae65 /system/libraries/Cache/drivers/Cache_redis.php | |
parent | 6c52096f4f9147244e9631b8040088025ae6e79d (diff) | |
parent | 2dcdd060fe8b4abdbb77d0535b9fc9ebf9f9f311 (diff) |
Merge pull request #3186 from ivantcholakov/feature/cache-redis-serialization
Cache_redis: Adding serialization support.
Diffstat (limited to 'system/libraries/Cache/drivers/Cache_redis.php')
-rw-r--r-- | system/libraries/Cache/drivers/Cache_redis.php | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 7a2b70382..b8f3f5d9a 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -58,6 +58,13 @@ class CI_Cache_redis extends CI_Driver */ protected $_redis; + /** + * An internal cache for storing keys of serialized values. + * + * @var array + */ + protected $_serialized; + // ------------------------------------------------------------------------ /** @@ -68,7 +75,14 @@ class CI_Cache_redis extends CI_Driver */ public function get($key) { - return $this->_redis->get($key); + $value = $this->_redis->get($key); + + if ($value !== FALSE && in_array($key, $this->_serialized, TRUE)) + { + return unserialize($value); + } + + return $value; } // ------------------------------------------------------------------------ @@ -84,6 +98,23 @@ class CI_Cache_redis extends CI_Driver */ public function save($id, $data, $ttl = 60, $raw = FALSE) { + if (is_array($data) OR is_object($data)) + { + $data = serialize($data); + + if ( ! in_array($id, $this->_serialized, TRUE)) + { + $this->_serialized[] = $id; + } + + $this->_redis->sAdd('_ci_redis_serialized', $id); + } + elseif (($index_key = array_search($id, $this->_serialized, TRUE)) !== FALSE) + { + unset($this->_serialized[$index_key]); + $this->_redis->sRemove('_ci_redis_serialized', $id); + } + return ($ttl) ? $this->_redis->setex($id, $ttl, $data) : $this->_redis->set($id, $data); @@ -99,7 +130,13 @@ class CI_Cache_redis extends CI_Driver */ public function delete($key) { - return ($this->_redis->delete($key) === 1); + if ($this->_redis->delete($key) === 1 && in_array($key, $this->_serialized, TRUE)) + { + $this->_redis->sRemove('_ci_redis_serialized', $key); + return TRUE; + } + + return FALSE; } // ------------------------------------------------------------------------ @@ -255,13 +292,21 @@ class CI_Cache_redis extends CI_Driver $this->_redis->auth($config['password']); } + // Initialize the index of serialized values. + $this->_serialized = $this->_redis->sMembers('_ci_redis_serialized'); + + if (empty($this->_serialized)) + { + // On error FALSE is returned, ensure array type for empty index. + $this->_serialized = array(); + } + return TRUE; } // ------------------------------------------------------------------------ /** - * Class destructor * * Closes the connection to Redis if present. |