Skip to content

Commit

Permalink
MC-21504: Decrease Redis CPU consumptions by loading cache that frequ…
Browse files Browse the repository at this point in the history
…ently used in one pipeline P1
  • Loading branch information
vzabaznov committed Feb 18, 2020
1 parent 262dbca commit 3c6be67
Showing 1 changed file with 51 additions and 1 deletion.
52 changes: 51 additions & 1 deletion lib/internal/Magento/Framework/Cache/Backend/Redis.php
Expand Up @@ -7,10 +7,60 @@
namespace Magento\Framework\Cache\Backend;

/**
* Redis wrapper to suppress exceptions on save
* Redis wrapper to extend current implementation behaviour.
*/
class Redis extends \Cm_Cache_Backend_Redis
{
/**
* Local state of preloaded keys.
*
* @var array
*/
private $preloadedData = [];

/**
* Array of keys to be preloaded.
*
* @var array
*/
private $preloadKeys = [];

/**
* @param array $options
*/
public function __construct($options = array())
{
$this->preloadKeys = $options['preload_keys'] ?? [];
parent::__construct($options);
}

/**
* Load value with given id from cache
*
* @param string $id Cache id
* @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested
* @return bool|string
*/
public function load($id, $doNotTestCacheValidity = false)
{
if (!empty($this->preloadKeys) && empty($this->preloadedData)) {
$redis = $this->_slave ?? $this->_redis;
$redis = $redis->pipeline();

foreach ($this->preloadKeys as $key) {
$redis->hGet(self::PREFIX_KEY . $key, self::FIELD_DATA);
}

$this->preloadedData= array_combine($this->preloadKeys, $redis->exec());
}

if (isset($this->preloadedData[$id])) {
return $this->_decodeData($this->preloadedData[$id]);
}

return parent::load($id, $doNotTestCacheValidity = false);
}

/**
* The idea is that base implementation doesn't handle errors on save operations.
* Which may occurs when Redis cannot evict keys, which is expected in some cases.
Expand Down

0 comments on commit 3c6be67

Please sign in to comment.