h4kuna/critical-cache

只能有一个进程可以写入或删除缓存。

v1.0.0 2024-08-28 08:41 UTC

This package is auto-updated.

Last update: 2024-08-28 08:44:02 UTC


README

Downloads this Month Latest stable

该库扩展了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