Skip to content
Snippets Groups Projects

Issue #2900947: Implement initial RedisCluster client integration

Open Issue #2900947: Implement initial RedisCluster client integration
2 unresolved threads
2 unresolved threads
Files
15
+ 101
0
<?php
namespace Drupal\redis\Cache;
use Drupal\Component\Serialization\SerializationInterface;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheTagsChecksumInterface;
/**
* PhpRedisCluster cache backend.
*/
class PhpRedisCluster extends CacheBase {
/**
* The client.
*
* @var \RedisCluster
*/
protected $client;
/**
* Creates a PhpRedisCluster cache backend.
*
* @param string $bin
* The cache bin for which the object is created.
* @param \RedisCluster $client
* The cluster client.
* @param \Drupal\Core\Cache\CacheTagsChecksumInterface $checksum_provider
* The cluster checksum.
* @param \Drupal\Component\Serialization\SerializationInterface $serializer
* The serialization class to use.
*/
public function __construct($bin, \RedisCluster $client, CacheTagsChecksumInterface $checksum_provider, SerializationInterface $serializer) {
parent::__construct($bin, $serializer);
$this->client = $client;
$this->checksumProvider = $checksum_provider;
}
/**
* {@inheritdoc}
*/
public function getMultiple(&$cids, $allow_invalid = FALSE) {
// Avoid an error when there are no cache ids.
if (empty($cids)) {
return [];
}
$return = [];
// Build the list of keys to fetch.
foreach (array_map([$this, 'getKey'], $cids) as $key) {
$result[] = $this->client->hGetAll($key);
}
// Loop over the cid values to ensure numeric indexes.
foreach (array_values($cids) as $index => $key) {
// Check if a valid result was returned from Redis.
if (isset($result[$index]) && is_array($result[$index])) {
// Check expiration and invalidation and convert into an object.
$item = $this->expandEntry($result[$index], $allow_invalid);
if ($item) {
$return[$item->cid] = $item;
}
}
}
// Remove fetched cids from the list.
$cids = array_diff($cids, array_keys($return));
return $return;
}
/**
* {@inheritdoc}
*/
public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = []) {
$ttl = $this->getExpiration($expire);
$key = $this->getKey($cid);
// If the item is already expired, delete it.
if ($ttl <= 0) {
$this->delete($key);
}
// Build the cache item and save it as a hash array.
$entry = $this->createEntryHash($cid, $data, $expire, $tags);
$this->client->hMset($key, $entry);
$this->client->expire($key, $ttl);
}
/**
* {@inheritdoc}
*/
public function doDeleteMultiple(array $cids) {
$keys = array_map([$this, 'getKey'], $cids);
$this->client->del($keys);
}
}
Loading