vectorface / cache
简单的缓存类
v0.6.0
2024-05-10 14:45 UTC
Requires
- php: >=8.0.0
- cheprasov/php-redis-client: ^1.10
- psr/log: ^1.0 || ^2.0 || ^3.0
- psr/simple-cache: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9.0
- squizlabs/php_codesniffer: ^3.0
Suggests
- ext-apcu: Needed to support caching in APC(u)
- ext-memcache: Needed to support caching with the Memcache extension
- ext-pdo: Needed to support in an SQL database
- ext-redis: Recommended for faster redis support
README
这是一个简单的缓存库。它公开了几个缓存机制(具有不同的语义),以及支持适应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.
接口支持可选的生存时间(过期),在底层缓存类型支持的情况下。该接口还提供了delete
、clean
和flush
方法,分别用于删除一个条目、所有过期条目和所有条目。
可用实现
APCCache
:APC或APCu。MCCache
:MemcacheRedisCache
: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);