Chris@0: Chris@0: */ Chris@0: class PredisCache extends CacheProvider Chris@0: { Chris@0: /** Chris@0: * @var ClientInterface Chris@0: */ Chris@0: private $client; Chris@0: Chris@0: /** Chris@0: * @param ClientInterface $client Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: public function __construct(ClientInterface $client) Chris@0: { Chris@0: $this->client = $client; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doFetch($id) Chris@0: { Chris@0: $result = $this->client->get($id); Chris@0: if (null === $result) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: return unserialize($result); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doFetchMultiple(array $keys) Chris@0: { Chris@0: $fetchedItems = call_user_func_array(array($this->client, 'mget'), $keys); Chris@0: Chris@0: return array_map('unserialize', array_filter(array_combine($keys, $fetchedItems))); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doSaveMultiple(array $keysAndValues, $lifetime = 0) Chris@0: { Chris@0: if ($lifetime) { Chris@0: $success = true; Chris@0: Chris@0: // Keys have lifetime, use SETEX for each of them Chris@0: foreach ($keysAndValues as $key => $value) { Chris@0: $response = $this->client->setex($key, $lifetime, serialize($value)); Chris@0: Chris@0: if ((string) $response != 'OK') { Chris@0: $success = false; Chris@0: } Chris@0: } Chris@0: Chris@0: return $success; Chris@0: } Chris@0: Chris@0: // No lifetime, use MSET Chris@0: $response = $this->client->mset(array_map(function ($value) { Chris@0: return serialize($value); Chris@0: }, $keysAndValues)); Chris@0: Chris@0: return (string) $response == 'OK'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doContains($id) Chris@0: { Chris@0: return (bool) $this->client->exists($id); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doSave($id, $data, $lifeTime = 0) Chris@0: { Chris@0: $data = serialize($data); Chris@0: if ($lifeTime > 0) { Chris@0: $response = $this->client->setex($id, $lifeTime, $data); Chris@0: } else { Chris@0: $response = $this->client->set($id, $data); Chris@0: } Chris@0: Chris@0: return $response === true || $response == 'OK'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doDelete($id) Chris@0: { Chris@0: return $this->client->del($id) >= 0; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doFlush() Chris@0: { Chris@0: $response = $this->client->flushdb(); Chris@0: Chris@0: return $response === true || $response == 'OK'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doGetStats() Chris@0: { Chris@0: $info = $this->client->info(); Chris@0: Chris@0: return array( Chris@0: Cache::STATS_HITS => $info['Stats']['keyspace_hits'], Chris@0: Cache::STATS_MISSES => $info['Stats']['keyspace_misses'], Chris@0: Cache::STATS_UPTIME => $info['Server']['uptime_in_seconds'], Chris@0: Cache::STATS_MEMORY_USAGE => $info['Memory']['used_memory'], Chris@0: Cache::STATS_MEMORY_AVAILABLE => false Chris@0: ); Chris@0: } Chris@0: }