perf: 增加原生缓存
This commit is contained in:
183
vendor/illuminate/redis/Connections/PacksPhpRedisValues.php
vendored
Normal file
183
vendor/illuminate/redis/Connections/PacksPhpRedisValues.php
vendored
Normal file
@@ -0,0 +1,183 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Redis\Connections;
|
||||
|
||||
use Redis;
|
||||
use RuntimeException;
|
||||
use UnexpectedValueException;
|
||||
|
||||
trait PacksPhpRedisValues
|
||||
{
|
||||
/**
|
||||
* Indicates if Redis supports packing.
|
||||
*
|
||||
* @var bool|null
|
||||
*/
|
||||
protected $supportsPacking;
|
||||
|
||||
/**
|
||||
* Indicates if Redis supports LZF compression.
|
||||
*
|
||||
* @var bool|null
|
||||
*/
|
||||
protected $supportsLzf;
|
||||
|
||||
/**
|
||||
* Indicates if Redis supports Zstd compression.
|
||||
*
|
||||
* @var bool|null
|
||||
*/
|
||||
protected $supportsZstd;
|
||||
|
||||
/**
|
||||
* Prepares the given values to be used with the `eval` command, including serialization and compression.
|
||||
*
|
||||
* @param array<int|string,string> $values
|
||||
* @return array<int|string,string>
|
||||
*/
|
||||
public function pack(array $values): array
|
||||
{
|
||||
if (empty($values)) {
|
||||
return $values;
|
||||
}
|
||||
|
||||
if ($this->supportsPacking()) {
|
||||
return array_map([$this->client, '_pack'], $values);
|
||||
}
|
||||
|
||||
if ($this->compressed()) {
|
||||
if ($this->supportsLzf() && $this->lzfCompressed()) {
|
||||
if (! function_exists('lzf_compress')) {
|
||||
throw new RuntimeException("'lzf' extension required to call 'lzf_compress'.");
|
||||
}
|
||||
|
||||
$processor = function ($value) {
|
||||
return \lzf_compress($this->client->_serialize($value));
|
||||
};
|
||||
} elseif ($this->supportsZstd() && $this->zstdCompressed()) {
|
||||
if (! function_exists('zstd_compress')) {
|
||||
throw new RuntimeException("'zstd' extension required to call 'zstd_compress'.");
|
||||
}
|
||||
|
||||
$compressionLevel = $this->client->getOption(Redis::OPT_COMPRESSION_LEVEL);
|
||||
|
||||
$processor = function ($value) use ($compressionLevel) {
|
||||
return \zstd_compress(
|
||||
$this->client->_serialize($value),
|
||||
$compressionLevel === 0 ? Redis::COMPRESSION_ZSTD_DEFAULT : $compressionLevel
|
||||
);
|
||||
};
|
||||
} else {
|
||||
throw new UnexpectedValueException(sprintf(
|
||||
'Unsupported phpredis compression in use [%d].',
|
||||
$this->client->getOption(Redis::OPT_COMPRESSION)
|
||||
));
|
||||
}
|
||||
} else {
|
||||
$processor = function ($value) {
|
||||
return $this->client->_serialize($value);
|
||||
};
|
||||
}
|
||||
|
||||
return array_map($processor, $values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if compression is enabled.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function compressed(): bool
|
||||
{
|
||||
return defined('Redis::OPT_COMPRESSION') &&
|
||||
$this->client->getOption(Redis::OPT_COMPRESSION) !== Redis::COMPRESSION_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if LZF compression is enabled.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function lzfCompressed(): bool
|
||||
{
|
||||
return defined('Redis::COMPRESSION_LZF') &&
|
||||
$this->client->getOption(Redis::OPT_COMPRESSION) === Redis::COMPRESSION_LZF;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if ZSTD compression is enabled.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function zstdCompressed(): bool
|
||||
{
|
||||
return defined('Redis::COMPRESSION_ZSTD') &&
|
||||
$this->client->getOption(Redis::OPT_COMPRESSION) === Redis::COMPRESSION_ZSTD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if LZ4 compression is enabled.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function lz4Compressed(): bool
|
||||
{
|
||||
return defined('Redis::COMPRESSION_LZ4') &&
|
||||
$this->client->getOption(Redis::OPT_COMPRESSION) === Redis::COMPRESSION_LZ4;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the current PhpRedis extension version supports packing.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function supportsPacking(): bool
|
||||
{
|
||||
if ($this->supportsPacking === null) {
|
||||
$this->supportsPacking = $this->phpRedisVersionAtLeast('5.3.5');
|
||||
}
|
||||
|
||||
return $this->supportsPacking;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the current PhpRedis extension version supports LZF compression.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function supportsLzf(): bool
|
||||
{
|
||||
if ($this->supportsLzf === null) {
|
||||
$this->supportsLzf = $this->phpRedisVersionAtLeast('4.3.0');
|
||||
}
|
||||
|
||||
return $this->supportsLzf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the current PhpRedis extension version supports Zstd compression.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function supportsZstd(): bool
|
||||
{
|
||||
if ($this->supportsZstd === null) {
|
||||
$this->supportsZstd = $this->phpRedisVersionAtLeast('5.1.0');
|
||||
}
|
||||
|
||||
return $this->supportsZstd;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the PhpRedis extension version is at least the given version.
|
||||
*
|
||||
* @param string $version
|
||||
* @return bool
|
||||
*/
|
||||
protected function phpRedisVersionAtLeast(string $version): bool
|
||||
{
|
||||
$phpredisVersion = phpversion('redis');
|
||||
|
||||
return $phpredisVersion !== false && version_compare($phpredisVersion, $version, '>=');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user