'Redis', 'prefix' => Inflector::slug(APP_DIR) . '_', 'server' => '127.0.0.1', 'database' => 0, 'port' => 6379, 'password' => false, 'timeout' => 0, 'persistent' => true, 'unix_socket' => false ), $settings) ); return $this->_connect(); } /** * Connects to a Redis server * * @return bool True if Redis server was connected */ protected function _connect() { try { $this->_Redis = new Redis(); if (!empty($this->settings['unix_socket'])) { $return = $this->_Redis->connect($this->settings['unix_socket']); } elseif (empty($this->settings['persistent'])) { $return = $this->_Redis->connect($this->settings['server'], $this->settings['port'], $this->settings['timeout']); } else { $persistentId = $this->settings['port'] . $this->settings['timeout'] . $this->settings['database']; $return = $this->_Redis->pconnect($this->settings['server'], $this->settings['port'], $this->settings['timeout'], $persistentId); } } catch (RedisException $e) { $return = false; } if (!$return) { return false; } if ($this->settings['password'] && !$this->_Redis->auth($this->settings['password'])) { return false; } return $this->_Redis->select($this->settings['database']); } /** * Write data for key into cache. * * @param string $key Identifier for the data * @param mixed $value Data to be cached * @param int $duration How long to cache the data, in seconds * @return bool True if the data was successfully cached, false on failure */ public function write($key, $value, $duration) { if (!is_int($value)) { $value = serialize($value); } if (!$this->_Redis->isConnected()) { $this->_connect(); } if ($duration === 0) { return $this->_Redis->set($key, $value); } return $this->_Redis->setex($key, $duration, $value); } /** * Read a key from the cache * * @param string $key Identifier for the data * @return mixed The cached data, or false if the data doesn't exist, has expired, or if there was an error fetching it */ public function read($key) { $value = $this->_Redis->get($key); if (ctype_digit($value)) { $value = (int)$value; } if ($value !== false && is_string($value)) { $value = unserialize($value); } return $value; } /** * Increments the value of an integer cached key * * @param string $key Identifier for the data * @param int $offset How much to increment * @return New incremented value, false otherwise * @throws CacheException when you try to increment with compress = true */ public function increment($key, $offset = 1) { return (int)$this->_Redis->incrBy($key, $offset); } /** * Decrements the value of an integer cached key * * @param string $key Identifier for the data * @param int $offset How much to subtract * @return New decremented value, false otherwise * @throws CacheException when you try to decrement with compress = true */ public function decrement($key, $offset = 1) { return (int)$this->_Redis->decrBy($key, $offset); } /** * Delete a key from the cache * * @param string $key Identifier for the data * @return bool True if the value was successfully deleted, false if it didn't exist or couldn't be removed */ public function delete($key) { return $this->_Redis->delete($key) > 0; } /** * Delete all keys from the cache * * @param bool $check Whether or not expiration keys should be checked. If * true, no keys will be removed as cache will rely on redis TTL's. * @return bool True if the cache was successfully cleared, false otherwise */ public function clear($check) { if ($check) { return true; } $keys = $this->_Redis->getKeys($this->settings['prefix'] . '*'); $this->_Redis->del($keys); return true; } /** * Returns the `group value` for each of the configured groups * If the group initial value was not found, then it initializes * the group accordingly. * * @return array */ public function groups() { $result = array(); foreach ($this->settings['groups'] as $group) { $value = $this->_Redis->get($this->settings['prefix'] . $group); if (!$value) { $value = 1; $this->_Redis->set($this->settings['prefix'] . $group, $value); } $result[] = $group . $value; } return $result; } /** * Increments the group value to simulate deletion of all keys under a group * old values will remain in storage until they expire. * * @param string $group The group name to clear. * @return bool success */ public function clearGroup($group) { return (bool)$this->_Redis->incr($this->settings['prefix'] . $group); } /** * Disconnects from the redis server */ public function __destruct() { if (!$this->settings['persistent']) { $this->_Redis->close(); } } /** * Write data for key into cache if it doesn't exist already. * If it already exists, it fails and returns false. * * @param string $key Identifier for the data. * @param mixed $value Data to be cached. * @param int $duration How long to cache the data, in seconds. * @return bool True if the data was successfully cached, false on failure. * @link https://github.com/phpredis/phpredis#setnx */ public function add($key, $value, $duration) { if (!is_int($value)) { $value = serialize($value); } $result = $this->_Redis->setnx($key, $value); // setnx() doesn't have an expiry option, so overwrite the key with one if ($result) { return $this->_Redis->setex($key, $duration, $value); } return false; } }