From 927e508f9bb73eb4b1e3fe763d2f3b722d5e8a30 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Thu, 14 Aug 2014 04:07:39 +0300 Subject: Cache_redis: Adding serialization support. --- system/libraries/Cache/drivers/Cache_redis.php | 59 +++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 7a2b70382..33a28de71 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -37,6 +37,11 @@ defined('BASEPATH') OR exit('No direct script access allowed'); */ class CI_Cache_redis extends CI_Driver { + /** + * The name of the Redis set that is to store keys of serialized values. + */ + const KEY_SET_FOR_SERIALIZATION = '_ci_redis_serialization_set'; + /** * Default config * @@ -58,6 +63,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 +80,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 AND in_array($key, $this->_serialized)) + { + return unserialize($value); + } + + return $value; } // ------------------------------------------------------------------------ @@ -84,6 +103,27 @@ 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 (($index_key = array_search($id, $this->_serialized)) === FALSE) + { + $this->_serialized[] = $id; + } + + $this->_redis->sAdd(self::KEY_SET_FOR_SERIALIZATION, $id); + } + else + { + if (($index_key = array_search($id, $this->_serialized)) !== FALSE) + { + unset($this->_serialized[$index_key]); + } + + $this->_redis->sRemove(self::KEY_SET_FOR_SERIALIZATION, $id); + } + return ($ttl) ? $this->_redis->setex($id, $ttl, $data) : $this->_redis->set($id, $data); @@ -99,6 +139,13 @@ class CI_Cache_redis extends CI_Driver */ public function delete($key) { + if (($index_key = array_search($key, $this->_serialized)) !== FALSE) + { + unset($this->_serialized[$index_key]); + } + + $this->_redis->sRemove(self::KEY_SET_FOR_SERIALIZATION, $key); + return ($this->_redis->delete($key) === 1); } @@ -255,13 +302,21 @@ class CI_Cache_redis extends CI_Driver $this->_redis->auth($config['password']); } + // Initialize the index of selialized values. + $this->_serialized = $this->_redis->sMembers(self::KEY_SET_FOR_SERIALIZATION); + + 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. -- cgit v1.2.3-24-g4f1b From e838c836fbe5ff5859e7a4450032572af31323e6 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 09:56:05 +0300 Subject: Cache_redis: AND -> && correction, srrict in_array() check. --- system/libraries/Cache/drivers/Cache_redis.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 33a28de71..68d96334f 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -82,7 +82,7 @@ class CI_Cache_redis extends CI_Driver { $value = $this->_redis->get($key); - if ($value !== FALSE AND in_array($key, $this->_serialized)) + if ($value !== FALSE && in_array($key, $this->_serialized, TRUE)) { return unserialize($value); } -- cgit v1.2.3-24-g4f1b From c773a484301ba147b6e849114097152518b9d4ee Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 10:02:49 +0300 Subject: Cache_redis: Strinct array_search() for now. --- system/libraries/Cache/drivers/Cache_redis.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 68d96334f..c0200aab7 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -107,7 +107,7 @@ class CI_Cache_redis extends CI_Driver { $data = serialize($data); - if (($index_key = array_search($id, $this->_serialized)) === FALSE) + if (($index_key = array_search($id, $this->_serialized, TRUE)) === FALSE) { $this->_serialized[] = $id; } @@ -116,7 +116,7 @@ class CI_Cache_redis extends CI_Driver } else { - if (($index_key = array_search($id, $this->_serialized)) !== FALSE) + if (($index_key = array_search($id, $this->_serialized, TRUE)) !== FALSE) { unset($this->_serialized[$index_key]); } @@ -139,7 +139,7 @@ class CI_Cache_redis extends CI_Driver */ public function delete($key) { - if (($index_key = array_search($key, $this->_serialized)) !== FALSE) + if (($index_key = array_search($key, $this->_serialized, TRUE)) !== FALSE) { unset($this->_serialized[$index_key]); } -- cgit v1.2.3-24-g4f1b From 58531403e7b2a49ba7d723e8792e8656b5172d83 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 10:19:27 +0300 Subject: Cache_redis, delete() method: Removing code for updating the internal cache, it is useless. --- system/libraries/Cache/drivers/Cache_redis.php | 7 ------- 1 file changed, 7 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index c0200aab7..9fbdc6593 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -139,13 +139,6 @@ class CI_Cache_redis extends CI_Driver */ public function delete($key) { - if (($index_key = array_search($key, $this->_serialized, TRUE)) !== FALSE) - { - unset($this->_serialized[$index_key]); - } - - $this->_redis->sRemove(self::KEY_SET_FOR_SERIALIZATION, $key); - return ($this->_redis->delete($key) === 1); } -- cgit v1.2.3-24-g4f1b From 7c835578642341a01958961eaa5e36e74ea92deb Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 10:37:29 +0300 Subject: Cache_redis, Hardcoded name for the auxilary Redis set - '_ci_redis_serialized'. --- system/libraries/Cache/drivers/Cache_redis.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 9fbdc6593..21ef9919d 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -37,11 +37,6 @@ defined('BASEPATH') OR exit('No direct script access allowed'); */ class CI_Cache_redis extends CI_Driver { - /** - * The name of the Redis set that is to store keys of serialized values. - */ - const KEY_SET_FOR_SERIALIZATION = '_ci_redis_serialization_set'; - /** * Default config * @@ -112,7 +107,7 @@ class CI_Cache_redis extends CI_Driver $this->_serialized[] = $id; } - $this->_redis->sAdd(self::KEY_SET_FOR_SERIALIZATION, $id); + $this->_redis->sAdd('_ci_redis_serialized', $id); } else { @@ -121,7 +116,7 @@ class CI_Cache_redis extends CI_Driver unset($this->_serialized[$index_key]); } - $this->_redis->sRemove(self::KEY_SET_FOR_SERIALIZATION, $id); + $this->_redis->sRemove('_ci_redis_serialized', $id); } return ($ttl) @@ -296,7 +291,7 @@ class CI_Cache_redis extends CI_Driver } // Initialize the index of selialized values. - $this->_serialized = $this->_redis->sMembers(self::KEY_SET_FOR_SERIALIZATION); + $this->_serialized = $this->_redis->sMembers('_ci_redis_serialized'); if (empty($this->_serialized)) { -- cgit v1.2.3-24-g4f1b From bc417613f3ea8910a48fc0788a1f9c6d05577aa5 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 11:11:39 +0300 Subject: Cache_redis, delete() method: Bringing back a line of code. --- system/libraries/Cache/drivers/Cache_redis.php | 3 +++ 1 file changed, 3 insertions(+) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 21ef9919d..20378785a 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -134,6 +134,9 @@ class CI_Cache_redis extends CI_Driver */ public function delete($key) { + // This is for not leaving garbage keys within the Redis auxilary set. + $this->_redis->sRemove('_ci_redis_serialized', $key); + return ($this->_redis->delete($key) === 1); } -- cgit v1.2.3-24-g4f1b From d514d5c436e599942f9cb00475f0543e705c9a0f Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 12:04:27 +0300 Subject: Cache_redis, delete() method: Try to remove a key from Redis auxilary set only when the corresponding value is really deleted. --- system/libraries/Cache/drivers/Cache_redis.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 20378785a..b5387c064 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -134,10 +134,13 @@ class CI_Cache_redis extends CI_Driver */ public function delete($key) { - // This is for not leaving garbage keys within the Redis auxilary set. - $this->_redis->sRemove('_ci_redis_serialized', $key); + if ($result = ($this->_redis->delete($key) === 1)) + { + // This is for not leaving garbage keys within the Redis auxilary set. + $this->_redis->sRemove('_ci_redis_serialized', $key); + } - return ($this->_redis->delete($key) === 1); + return $result; } // ------------------------------------------------------------------------ -- cgit v1.2.3-24-g4f1b From 52b32530a8503d7da29c24ff72701b6eef28742d Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 12:30:04 +0300 Subject: Cache_redis, save() method: An optimization, moving sRemove call. --- system/libraries/Cache/drivers/Cache_redis.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index b5387c064..26de61db8 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -114,9 +114,8 @@ class CI_Cache_redis extends CI_Driver if (($index_key = array_search($id, $this->_serialized, TRUE)) !== FALSE) { unset($this->_serialized[$index_key]); + $this->_redis->sRemove('_ci_redis_serialized', $id); } - - $this->_redis->sRemove('_ci_redis_serialized', $id); } return ($ttl) -- cgit v1.2.3-24-g4f1b From ff4d114346a9c09df6d877e7d683155e5868d9e0 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 12:40:26 +0300 Subject: Cache_redis: Refactoring if delete() method. --- system/libraries/Cache/drivers/Cache_redis.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 26de61db8..c1f593d27 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -133,13 +133,13 @@ class CI_Cache_redis extends CI_Driver */ public function delete($key) { - if ($result = ($this->_redis->delete($key) === 1)) + if ($this->_redis->delete($key) === 1 && array_search($key, $this->_serialized, TRUE) !== FALSE) { - // This is for not leaving garbage keys within the Redis auxilary set. $this->_redis->sRemove('_ci_redis_serialized', $key); + return TRUE; } - return $result; + return FALSE; } // ------------------------------------------------------------------------ -- cgit v1.2.3-24-g4f1b From d245f0610cb8dc0f559866a85286b39c35d5d910 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 13:52:44 +0300 Subject: Cache_redis: Polishing. --- system/libraries/Cache/drivers/Cache_redis.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index c1f593d27..9cb789eb0 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -109,13 +109,10 @@ class CI_Cache_redis extends CI_Driver $this->_redis->sAdd('_ci_redis_serialized', $id); } - else + elseif (($index_key = array_search($id, $this->_serialized, TRUE)) !== FALSE) { - if (($index_key = array_search($id, $this->_serialized, TRUE)) !== FALSE) - { - unset($this->_serialized[$index_key]); - $this->_redis->sRemove('_ci_redis_serialized', $id); - } + unset($this->_serialized[$index_key]); + $this->_redis->sRemove('_ci_redis_serialized', $id); } return ($ttl) @@ -295,7 +292,7 @@ class CI_Cache_redis extends CI_Driver $this->_redis->auth($config['password']); } - // Initialize the index of selialized values. + // Initialize the index of serialized values. $this->_serialized = $this->_redis->sMembers('_ci_redis_serialized'); if (empty($this->_serialized)) -- cgit v1.2.3-24-g4f1b From 73f930214780f975c1afe929dd287e219b291830 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 14:41:49 +0300 Subject: Cache_redis: Optimizations. --- system/libraries/Cache/drivers/Cache_redis.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 9cb789eb0..4a8ad5d67 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -102,7 +102,7 @@ class CI_Cache_redis extends CI_Driver { $data = serialize($data); - if (($index_key = array_search($id, $this->_serialized, TRUE)) === FALSE) + if (! in_array($id, $this->_serialized, TRUE)) { $this->_serialized[] = $id; } @@ -130,7 +130,7 @@ class CI_Cache_redis extends CI_Driver */ public function delete($key) { - if ($this->_redis->delete($key) === 1 && array_search($key, $this->_serialized, TRUE) !== FALSE) + if ($this->_redis->delete($key) === 1 && in_array($key, $this->_serialized, TRUE)) { $this->_redis->sRemove('_ci_redis_serialized', $key); return TRUE; -- cgit v1.2.3-24-g4f1b From 2dcdd060fe8b4abdbb77d0535b9fc9ebf9f9f311 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Mon, 18 Aug 2014 15:01:58 +0300 Subject: Cache_redis: A code-styling correction.. --- system/libraries/Cache/drivers/Cache_redis.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'system/libraries/Cache/drivers') diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 4a8ad5d67..b8f3f5d9a 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -102,7 +102,7 @@ class CI_Cache_redis extends CI_Driver { $data = serialize($data); - if (! in_array($id, $this->_serialized, TRUE)) + if ( ! in_array($id, $this->_serialized, TRUE)) { $this->_serialized[] = $id; } -- cgit v1.2.3-24-g4f1b