vectorface/cache

简单的缓存类

v0.6.0 2024-05-10 14:45 UTC

This package is auto-updated.

Last update: 2024-09-10 15:33:57 UTC


README

Build Status Code Coverage Latest Stable Version License

这是一个简单的缓存库。它公开了几个缓存机制(具有不同的语义),以及支持适应PSR-16兼容接口和原子计数器。没有太多花哨的功能。

接口

缓存接口公开了获取和设置方法,这些方法正好符合您对缓存的期望

use Vectorface\Cache\PHPCache;

// PHPCache is a trivial array-backed cache.
$cache = new PHPCache();
$cache->get("foo"); // null, because we just created this cache.
$cache->get("foo", "dflt"); // "dflt"; same as above, but with our own default
$cache->set("foo", "bar"); // returns true if set. This cache always succeeds.
$cache->get("foo"); // "bar", because we just set it.

接口支持可选的生存时间(过期),在底层缓存类型支持的情况下。该接口还提供了deletecleanflush方法,分别用于删除一个条目、所有过期条目和所有条目。

可用实现

  • APCCache:APC或APCu。
  • MCCache:Memcache
  • RedisCache:Redis,使用phpredis扩展或php-redis-client库。
  • NullCache:您的数据黑洞。
  • PHPCache:在本地变量中存储值,仅用于一次脚本执行。
  • SQLCache:值存储在SQL表中,通过PDO访问。
  • TempFileCache:将值存储在临时文件中。不支持原子计数。
  • TieredCache:将上述任何缓存层叠在一起以形成混合缓存。不支持原子计数。

实际应用

您为什么要使用这个?它使您几乎可以无需任何代码更改就切换底层缓存实现。这对于测试特别有用。

use Vectorface\Cache\APCCache;
use Vectorface\Cache\PHPCache;
use Vectorface\Cache\TempFileCache;

// Memcache and SQL-based caches also work, but aren't as good as examples.
$caches = [new APCCache(), new PHPCache(), new TempFileCache()];
foreach ($caches as $cache) {
    // Look ma! Same interface!
    $cache->set('foo', 'bar');
    $cache->get('foo');
}

原子计数器

缓存的常见用途是实现原子计数,即增加或减少一定量。原子性对于分布式环境中的可靠性很重要,以避免竞争条件。

并非本库中的所有缓存实现都支持原子计数,因为这要么是不可能的,要么在该上下文中没有意义。

use Vectorface\Cache\APCCache;
use Vectorface\Cache\AtomicCounter;

$cache = new APCCache();
assert($cache instanceof AtomicCounter);

// Can increment and decrement by key, defaults to steps of 1
assert($cache->increment("counter") === 1);
assert($cache->increment("counter") === 2);
assert($cache->decrement("counter") === 1);

// Can step by arbitrary amounts
assert($cache->increment("counter", 5) === 6);
assert($cache->decrement("counter", 2) === 4);

分层缓存

另一个特别有用的功能是能够堆叠缓存。您可以将快速缓存放在依次更慢的缓存前面,假设快速缓存将具有更少的存储空间,并且删除使用较少的项目。

use Vectorface\Cache\APCCache;
use Vectorface\Cache\MCCache;
use Vectorface\Cache\TempFileCache;
use Vectorface\Cache\TieredCache;

$memcache = new Memcache();
$memcache->addServer("127.0.0.1");
$cache = new TieredCache([
    new APCCache(),
    new MCCache($memcache),
    new TempFileCache(),
]);

$cache->get("foo"); // Tries all caches in sequence until one succeeds. Fails if none succeed.
$cache->set("foo", "bar"); // Sets a value in all caches.
$cache->get("foo"); // Tries all caches in sequence. The fastest should succeed and return quickly.

PSR-16 支持

如果您需要与其他支持PSR-16 SimpleCache的工具进行互操作,您可以使用SimpleCacheAdapter类,该类可以包装本库中的任何缓存实现。

use Psr\SimpleCache\CacheInterface;
use Vectorface\Cache\PHPCache;
use Vectorface\Cache\SimpleCacheAdapter;

$psr16Cache = new SimpleCacheAdapter(new PHPCache());

assert($psr16Cache instanceof CacheInterface);