Skip to content

Commit

Permalink
Updated to support Laravel <= 7.0 when there were no cache locks. Add…
Browse files Browse the repository at this point in the history
…ed basic tests for locks. Updated Readme.md to clarify the way tags are working and their main purpose.
  • Loading branch information
swayok committed Apr 12, 2021
1 parent c94c6c6 commit a3a58de
Show file tree
Hide file tree
Showing 14 changed files with 287 additions and 121 deletions.
4 changes: 1 addition & 3 deletions AlternativeLaravelCache/Core/AlternativeCacheStore.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@
use Cache\Hierarchy\HierarchicalPoolInterface;
use Cache\TagInterop\TaggableCacheItemPoolInterface;
use Illuminate\Cache\TaggableStore;
use Illuminate\Contracts\Cache\LockProvider;
use Illuminate\Contracts\Cache\Store;

abstract class AlternativeCacheStore extends TaggableStore implements LockProvider {
abstract class AlternativeCacheStore extends TaggableStore {

/**
* The database connection.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
namespace AlternativeLaravelCache\Provider;

use AlternativeLaravelCache\Store\AlternativeFileCacheStore;
use AlternativeLaravelCache\Store\AlternativeFileCacheStoreWithLocks;
use AlternativeLaravelCache\Store\AlternativeHierarchialFileCacheStore;
use AlternativeLaravelCache\Store\AlternativeHierarchialFileCacheStoreWithLocks;
use AlternativeLaravelCache\Store\AlternativeMemcachedCacheStore;
use AlternativeLaravelCache\Store\AlternativeMemcachedCacheStoreWithLocks;
use AlternativeLaravelCache\Store\AlternativeRedisCacheStore;
use InvalidArgumentException;
use AlternativeLaravelCache\Store\AlternativeRedisCacheStoreWithLocks;
use Illuminate\Cache\CacheManager;
use Illuminate\Support\Arr;
use Illuminate\Support\ServiceProvider;
use InvalidArgumentException;
use League\Flysystem\Adapter\Local;
use League\Flysystem\Filesystem;

Expand All @@ -28,59 +32,84 @@ public function register() {

protected function addDriversToCacheManager() {
$cacheManager = $this->app->make('cache');
$this->addRedisCacheDriver($cacheManager);
$this->addMemcachedCacheDriver($cacheManager);
$this->addFileCacheDriver($cacheManager);
$this->addHierarchialFileCacheDriver($cacheManager);
$hasLocks = trait_exists('\Illuminate\Cache\HasCacheLock');
$this->addRedisCacheDriver($cacheManager, $hasLocks);
$this->addMemcachedCacheDriver($cacheManager, $hasLocks);
$this->addFileCacheDriver($cacheManager, $hasLocks);
$this->addHierarchialFileCacheDriver($cacheManager, $hasLocks);
}

protected function addRedisCacheDriver(CacheManager $cacheManager) {
protected function addRedisCacheDriver(CacheManager $cacheManager, bool $hasLocks) {
$provider = $this;
$cacheManager->extend(static::$redisDriverName, function ($app, array $cacheConfig) use ($provider, $cacheManager) {
$store = new AlternativeRedisCacheStore(
$app['redis'],
$provider::getPrefix($cacheConfig),
$provider::getConnectionName($cacheConfig)
);
$cacheManager->extend(static::$redisDriverName, function ($app, array $cacheConfig) use ($hasLocks, $provider, $cacheManager) {
if ($hasLocks) {
$store = new AlternativeRedisCacheStoreWithLocks(
$app['redis'],
$provider::getPrefix($cacheConfig),
$provider::getConnectionName($cacheConfig)
);
} else {
$store = new AlternativeRedisCacheStore(
$app['redis'],
$provider::getPrefix($cacheConfig),
$provider::getConnectionName($cacheConfig)
);
}
$store->getWrappedConnection()->setLogger(app('log'));
return $cacheManager->repository($store);
});
}

protected function addMemcachedCacheDriver(CacheManager $cacheManager) {
protected function addMemcachedCacheDriver(CacheManager $cacheManager, bool $hasLocks) {
$provider = $this;
$cacheManager->extend(static::$memcacheDriverName, function ($app, array $cacheConfig) use ($provider, $cacheManager) {
$cacheManager->extend(static::$memcacheDriverName, function ($app, array $cacheConfig) use ($hasLocks, $provider, $cacheManager) {
$memcached = $this->app['memcached.connector']->connect(
$cacheConfig['servers'],
$cacheConfig['persistent_id'] ?? null,
$cacheConfig['options'] ?? [],
array_filter($cacheConfig['sasl'] ?? [])
);
$store = new AlternativeMemcachedCacheStore(
$memcached,
$provider::getPrefix($cacheConfig),
$provider::getConnectionName($cacheConfig)
);
if ($hasLocks) {
$store = new AlternativeMemcachedCacheStoreWithLocks(
$memcached,
$provider::getPrefix($cacheConfig),
$provider::getConnectionName($cacheConfig)
);
} else {
$store = new AlternativeMemcachedCacheStore(
$memcached,
$provider::getPrefix($cacheConfig),
$provider::getConnectionName($cacheConfig)
);
}
$store->getWrappedConnection()->setLogger(app('log'));
return $cacheManager->repository($store);
});
}

protected function addFileCacheDriver(CacheManager $cacheManager) {
protected function addFileCacheDriver(CacheManager $cacheManager, bool $hasLocks) {
$provider = $this;
$cacheManager->extend(static::$fileDriverName, function ($app, array $cacheConfig) use ($provider, $cacheManager) {
$cacheManager->extend(static::$fileDriverName, function ($app, array $cacheConfig) use ($hasLocks, $provider, $cacheManager) {
$db = new Filesystem($provider::makeFileCacheAdapter($cacheConfig));
$store = new AlternativeFileCacheStore($db, $provider::getPrefix($cacheConfig));
if ($hasLocks) {
$store = new AlternativeFileCacheStoreWithLocks($db, $provider::getPrefix($cacheConfig));
} else {
$store = new AlternativeFileCacheStore($db, $provider::getPrefix($cacheConfig));
}
$store->getWrappedConnection()->setLogger(app('log'));
return $cacheManager->repository($store);
});
}

protected function addHierarchialFileCacheDriver(CacheManager $cacheManager) {
protected function addHierarchialFileCacheDriver(CacheManager $cacheManager, bool $hasLocks) {
$provider = $this;
$cacheManager->extend(static::$hierarchialFileDriverName, function ($app, array $cacheConfig) use ($provider, $cacheManager) {
$cacheManager->extend(static::$hierarchialFileDriverName, function ($app, array $cacheConfig) use ($hasLocks, $provider, $cacheManager) {
$db = new Filesystem($provider::makeFileCacheAdapter($cacheConfig));
$store = new AlternativeHierarchialFileCacheStore($db, $provider::getPrefix($cacheConfig));
if ($hasLocks) {
$store = new AlternativeHierarchialFileCacheStoreWithLocks($db, $provider::getPrefix($cacheConfig));
} else {
$store = new AlternativeHierarchialFileCacheStore($db, $provider::getPrefix($cacheConfig));
}
$store->getWrappedConnection()->setLogger(app('log'));
return $cacheManager->repository($store);
});
Expand Down
4 changes: 0 additions & 4 deletions AlternativeLaravelCache/Store/AlternativeFileCacheStore.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@
use Cache\Adapter\Common\AbstractCachePool;
use Cache\Adapter\Filesystem\FilesystemCachePool;
use Cache\TagInterop\TaggableCacheItemPoolInterface;
use Illuminate\Cache\HasCacheLock;
use League\Flysystem\Filesystem;

class AlternativeFileCacheStore extends AlternativeCacheStore {

use HasCacheLock;

/**
* The Illuminate Filesystem instance.
*
Expand Down Expand Up @@ -42,5 +39,4 @@ public function fixItemKey($key) {
$key
));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace AlternativeLaravelCache\Store;

use Illuminate\Cache\HasCacheLock;
use Illuminate\Contracts\Cache\LockProvider;

class AlternativeFileCacheStoreWithLocks extends AlternativeFileCacheStore implements LockProvider {

use HasCacheLock;

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,10 @@
use Cache\Adapter\Common\AbstractCachePool;
use Cache\Hierarchy\HierarchicalPoolInterface;
use Cache\TagInterop\TaggableCacheItemPoolInterface;
use Illuminate\Cache\HasCacheLock;
use League\Flysystem\Filesystem;

class AlternativeHierarchialFileCacheStore extends AlternativeCacheStore {

use HasCacheLock;

/**
* The Illuminate Filesystem instance.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace AlternativeLaravelCache\Store;

use Illuminate\Cache\HasCacheLock;

class AlternativeHierarchialFileCacheStoreWithLocks extends AlternativeHierarchialFileCacheStore {

use HasCacheLock;

}
24 changes: 0 additions & 24 deletions AlternativeLaravelCache/Store/AlternativeMemcachedCacheStore.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
use AlternativeLaravelCache\Core\AlternativeCacheStore;
use Cache\Adapter\Common\AbstractCachePool;
use Cache\Adapter\Memcached\MemcachedCachePool;
use Illuminate\Cache\MemcachedLock;

/**
* @method \Memcached getDb()
Expand Down Expand Up @@ -44,27 +43,4 @@ public function fixItemKey($key) {
// not allowed characters: {}()/\@:
return preg_replace('%[\{\}\(\)\/@:\\\]%', '-', parent::fixItemKey($key));
}

/**
* Get a lock instance.
*
* @param string $name
* @param int $seconds
* @param string|null $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function lock($name, $seconds = 0, $owner = null) {
return new MemcachedLock($this->getDb(), $this->prefix . $name, $seconds, $owner);
}

/**
* Restore a lock instance using the owner identifier.
*
* @param string $name
* @param string $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function restoreLock($name, $owner) {
return $this->lock($name, 0, $owner);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace AlternativeLaravelCache\Store;

use Illuminate\Cache\MemcachedLock;

class AlternativeMemcachedCacheStoreWithLocks extends AlternativeMemcachedCacheStore {

/**
* Get a lock instance.
*
* @param string $name
* @param int $seconds
* @param string|null $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function lock($name, $seconds = 0, $owner = null) {
return new MemcachedLock($this->getDb(), $this->prefix . $name, $seconds, $owner);
}

/**
* Restore a lock instance using the owner identifier.
*
* @param string $name
* @param string $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function restoreLock($name, $owner) {
return $this->lock($name, 0, $owner);
}
}
52 changes: 0 additions & 52 deletions AlternativeLaravelCache/Store/AlternativeRedisCacheStore.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
use Cache\Adapter\Common\AbstractCachePool;
use Cache\Adapter\Predis\PredisCachePool;
use Cache\Adapter\Redis\RedisCachePool;
use Illuminate\Cache\RedisLock;
use Illuminate\Redis\RedisManager;

/**
Expand All @@ -21,13 +20,6 @@ class AlternativeRedisCacheStore extends AlternativeCacheStore {
*/
protected $db;

/**
* The name of the connection that should be used for locks.
*
* @var string
*/
protected $lockConnection;

/**
* Wrap Redis connection with PredisCachePool
*
Expand Down Expand Up @@ -72,48 +64,4 @@ public function fixItemKey($key) {
return preg_replace('%[\{\}\(\)\/@:\\\]%', '-', parent::fixItemKey($key));
}

/**
* Specify the name of the connection that should be used to manage locks.
*
* @param string $connection
* @return $this
*/
public function setLockConnection($connection) {
$this->lockConnection = $connection;

return $this;
}

/**
* Get the Redis connection instance that should be used to manage locks.
*
* @return \Illuminate\Redis\Connections\Connection
*/
public function lockConnection() {
return $this->getDb()
->connection($this->lockConnection ?? $this->connection);
}

/**
* Get a lock instance.
*
* @param string $name
* @param int $seconds
* @param string|null $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function lock($name, $seconds = 0, $owner = null) {
return new RedisLock($this->lockConnection(), $this->prefix . $name, $seconds, $owner);
}

/**
* Restore a lock instance using the owner identifier.
*
* @param string $name
* @param string $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function restoreLock($name, $owner) {
return $this->lock($name, 0, $owner);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

namespace AlternativeLaravelCache\Store;

use Illuminate\Cache\RedisLock;

class AlternativeRedisCacheStoreWithLocks extends AlternativeRedisCacheStore {

/**
* The name of the connection that should be used for locks.
*
* @var string
*/
protected $lockConnection;

/**
* Specify the name of the connection that should be used to manage locks.
*
* @param string $connection
* @return $this
*/
public function setLockConnection($connection) {
$this->lockConnection = $connection;

return $this;
}

/**
* Get the Redis connection instance that should be used to manage locks.
*
* @return \Illuminate\Redis\Connections\Connection
*/
public function lockConnection() {
return $this->getDb()
->connection($this->lockConnection ?? $this->connection);
}

/**
* Get a lock instance.
*
* @param string $name
* @param int $seconds
* @param string|null $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function lock($name, $seconds = 0, $owner = null) {
return new RedisLock($this->lockConnection(), $this->prefix . $name, $seconds, $owner);
}

/**
* Restore a lock instance using the owner identifier.
*
* @param string $name
* @param string $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function restoreLock($name, $owner) {
return $this->lock($name, 0, $owner);
}
}
Loading

0 comments on commit a3a58de

Please sign in to comment.