[Cache] Clean RedisAdapter pipelining + FilesystemAdapter
This commit is contained in:
parent
c86a1a145a
commit
acf007529f
@ -132,11 +132,8 @@ class FilesystemAdapter extends AbstractAdapter
|
|||||||
$expiresAt = $lifetime ? time() + $lifetime : PHP_INT_MAX;
|
$expiresAt = $lifetime ? time() + $lifetime : PHP_INT_MAX;
|
||||||
|
|
||||||
foreach ($values as $id => $value) {
|
foreach ($values as $id => $value) {
|
||||||
$file = $this->getFile($id);
|
$file = $this->getFile($id, true);
|
||||||
$dir = dirname($file);
|
|
||||||
if (!file_exists($dir)) {
|
|
||||||
@mkdir($dir, 0777, true);
|
|
||||||
}
|
|
||||||
$value = $expiresAt."\n".rawurlencode($id)."\n".serialize($value);
|
$value = $expiresAt."\n".rawurlencode($id)."\n".serialize($value);
|
||||||
if (false !== @file_put_contents($file, $value, LOCK_EX)) {
|
if (false !== @file_put_contents($file, $value, LOCK_EX)) {
|
||||||
@touch($file, $expiresAt);
|
@touch($file, $expiresAt);
|
||||||
@ -148,10 +145,15 @@ class FilesystemAdapter extends AbstractAdapter
|
|||||||
return $ok;
|
return $ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getFile($id)
|
private function getFile($id, $mkdir = false)
|
||||||
{
|
{
|
||||||
$hash = str_replace('/', '-', base64_encode(md5($id, true)));
|
$hash = str_replace('/', '-', base64_encode(md5($id, true)));
|
||||||
|
$dir = $this->directory.$hash[0].DIRECTORY_SEPARATOR.$hash[1].DIRECTORY_SEPARATOR;
|
||||||
|
|
||||||
return $this->directory.$hash[0].DIRECTORY_SEPARATOR.$hash[1].DIRECTORY_SEPARATOR.substr($hash, 2, -2);
|
if ($mkdir && !file_exists($dir)) {
|
||||||
|
@mkdir($dir, 0777, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dir.substr($hash, 2, -2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -233,51 +233,62 @@ class RedisAdapter extends AbstractAdapter
|
|||||||
if (!$serialized) {
|
if (!$serialized) {
|
||||||
return $failed;
|
return $failed;
|
||||||
}
|
}
|
||||||
if ($lifetime > 0) {
|
|
||||||
if ($this->redis instanceof \RedisArray) {
|
if (0 >= $lifetime) {
|
||||||
$redis = array();
|
$this->redis->mSet($serialized);
|
||||||
foreach ($serialized as $id => $value) {
|
|
||||||
if (!isset($redis[$h = $this->redis->_target($id)])) {
|
return $failed;
|
||||||
$redis[$h] = $this->redis->_instance($h);
|
|
||||||
$redis[$h]->multi(\Redis::PIPELINE);
|
|
||||||
}
|
|
||||||
$redis[$h]->setEx($id, $lifetime, $value);
|
|
||||||
}
|
|
||||||
foreach ($redis as $h) {
|
|
||||||
if (!$h->exec()) {
|
|
||||||
$failed = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->pipeline(function ($pipe) use ($serialized, $lifetime) {
|
|
||||||
foreach ($serialized as $id => $value) {
|
|
||||||
$pipe->setEx($id, $lifetime, $value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} elseif (!$this->redis->mSet($serialized)) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->pipeline(function ($pipe) use (&$serialized, $lifetime) {
|
||||||
|
foreach ($serialized as $id => $value) {
|
||||||
|
$pipe('setEx', $id, array($lifetime, $value));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return $failed;
|
return $failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function execute($command, $id, array $args, $redis = null)
|
||||||
|
{
|
||||||
|
array_unshift($args, $id);
|
||||||
|
call_user_func_array(array($redis ?: $this->redis, $command), $args);
|
||||||
|
}
|
||||||
|
|
||||||
private function pipeline(\Closure $callback)
|
private function pipeline(\Closure $callback)
|
||||||
{
|
{
|
||||||
if ($this->redis instanceof \Predis\Client) {
|
$redis = $this->redis;
|
||||||
return $this->redis->pipeline($callback);
|
|
||||||
}
|
|
||||||
$pipe = $this->redis instanceof \Redis && $this->redis->multi(\Redis::PIPELINE);
|
|
||||||
try {
|
try {
|
||||||
$e = null;
|
if ($redis instanceof \Predis\Client) {
|
||||||
$callback($this->redis);
|
$redis->pipeline(function ($pipe) use ($callback) {
|
||||||
} catch (\Exception $e) {
|
$this->redis = $pipe;
|
||||||
}
|
$callback(array($this, 'execute'));
|
||||||
if ($pipe) {
|
});
|
||||||
$this->redis->exec();
|
} elseif ($redis instanceof \RedisArray) {
|
||||||
}
|
$connections = array();
|
||||||
if (null !== $e) {
|
$callback(function ($command, $id, $args) use (&$connections) {
|
||||||
throw $e;
|
if (!isset($connections[$h = $this->redis->_target($id)])) {
|
||||||
|
$connections[$h] = $this->redis->_instance($h);
|
||||||
|
$connections[$h]->multi(\Redis::PIPELINE);
|
||||||
|
}
|
||||||
|
$this->execute($command, $id, $args, $connections[$h]);
|
||||||
|
});
|
||||||
|
foreach ($connections as $c) {
|
||||||
|
$c->exec();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$pipe = $redis->multi(\Redis::PIPELINE);
|
||||||
|
try {
|
||||||
|
$callback(array($this, 'execute'));
|
||||||
|
} finally {
|
||||||
|
if ($pipe) {
|
||||||
|
$redis->exec();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
$this->redis = $redis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user