h4kuna / critical-cache
只能有一个进程可以写入或删除缓存。
v1.0.0
2024-08-28 08:41 UTC
Requires
- php: >=8.0
- h4kuna/memoize: ^0.1.7
- psr/clock: ^1.0
- psr/simple-cache: ^3.0
Requires (Dev)
- beste/clock: ^3.0
- h4kuna/dir: ^0.1.7
- malkusch/lock: ^2.2
- nette/caching: ^3.2
- nette/tester: ^2.4
- orisai/clock: ^1.2
- phpstan/phpstan: ^1.8
- phpstan/phpstan-strict-rules: ^1.4
- tracy/tracy: ^2.9
Suggests
- h4kuna/dir: malkusch/lock and nette/cache need to create directories.
- malkusch/lock: As default implementation for Lock system.
- nette/caching: As default implementation for Cache for PSR-16.
README
该库扩展了PSR-16关于写入或删除缓存时的锁定。
项目安装
composer require h4kuna/critical-cache
可选
composer require h4kuna/dir malkusch/lock nette/caching beste/clock
如何使用
第一次可以使用准备好的工厂 CacheFactory。工厂会告诉你缺少哪些依赖。依赖不是强制的,因为所有内容都可以用你的实现来替换。
use h4kuna\CriticalCache\PSR16\Locking\CacheLockingFactory; $cacheFactory = new CacheLockingFactory('/my/temp'); $cache = $cacheFactory->create(); assert($cache instanceof Psr\SimpleCache\CacheInterface); $data = $cache->load('foo', fn() => 'done'); echo $data; // done
方法 load
尝试从缓存中读取数据,如果数据不是 null
则成功,否则通过锁定系统(互斥锁)创建临界区,然后再次尝试从缓存中读取数据,因为任何并行进程都可能更快,如果成功则解锁临界区并返回数据,否则调用回调以创建缓存,将数据保存到缓存中,然后解锁并返回数据。
池
支持使用多级缓存实现CacheInterface。按照顺序:内存 -> 文件系统。
use h4kuna\CriticalCache\PSR16\Locking\CacheLockingFactory; use h4kuna\CriticalCache\PSR16\Pool\CachePoolFactory; $cacheFactory = new CacheLockingFactory('/my/temp'); $cachePoolFactory = new CachePoolFactory($cacheFactory); $cache = $cachePoolFactory->create(); // by default create MemoryCache and FileSystem. You can choose redis, memcache. $cache->set('foo', 1); // write to memory and filesystem $cache1 = $cachePoolFactory->create(); // try to load from Memory (not found), second is Filesystem (found), and save to Memory, return result. echo $cache1->get('foo'); // 1
锁定
默认情况下,使用 malkusch/lock,但如果实现了 Lock 接口,可以使用不同的库。
默认情况下使用 FlockMutex,这也是为什么需要 h4kuna/dir 的原因。如果你使用不同的 Lock,则不需要之前的库。
缓存
默认情况下,使用 nette/caching 与 PSR16 适配器。
时钟 PSR-20
内部缓存系统 beste/clock