yiisoft/cache

3.0.0 2023-02-15 14:30 UTC

This package is auto-updated.

Last update: 2024-09-19 13:31:01 UTC


README

Yii

Yii 缓存库


Latest Stable Version Total Downloads Build status Code Coverage Mutation testing badge static analysis psalm-level type-coverage

此库是围绕与 PSR-16 兼容的缓存库的包装器,提供自己的功能。它用于 Yii 框架,但也可以单独使用。

功能

  • 基于 PSR-16 构建,可以使用任何 PSR-16 缓存作为处理程序。
  • 能够为每个缓存实例设置默认 TTL 和键前缀。
  • 提供内置的缓存雪崩防止行为。
  • 在 PSR-16 的基础上添加缓存失效依赖。

要求

  • PHP 8.0 或更高版本。
  • JSON PHP 扩展。
  • Mbstring PHP 扩展。

安装

可以使用 Composer 安装此包。

composer require yiisoft/cache

配置

有两种方式获取缓存实例。如果您需要 PSR-16 实例,可以简单创建它

$arrayCache = new \Yiisoft\Cache\ArrayCache();

为了设置全局键前缀

$arrayCacheWithPrefix = new \Yiisoft\Cache\PrefixedCache(new \Yiisoft\Cache\ArrayCache(), 'myapp_');

如果您需要一种更简单但更强大的方式来缓存基于重新计算回调的值,请使用 getOrSet()remove(),以及诸如失效依赖和“可能过期”雪崩防止等附加功能,您应该使用 \Yiisoft\Cache\Cache 包装 PSR-16 缓存实例

$cache = new \Yiisoft\Cache\Cache($arrayCache);

设置默认 TTL

$cache = new \Yiisoft\Cache\Cache($arrayCache, 60 * 60); // 1 hour

常规使用

典型的 PSR-16 缓存使用方法如下

$cache = new \Yiisoft\Cache\ArrayCache();
$parameters = ['user_id' => 42];
$key = 'demo';

// Try retrieving $data from cache.
$data = $cache->get($key);
if ($data === null) {
    // $data is not found in cache, calculate it from scratch.
    $data = calculateData($parameters);
    
    // Store $data in cache for an hour so that it can be retrieved next time.
    $cache->set($key, $data, 3600);
}

// $data is available here.

为了删除值,您可以使用

$cache->delete($key);
// Or all cache
$cache->clear();

为了更有效地处理值,应使用批处理操作

  • getMultiple()
  • setMultiple()
  • deleteMultiple()

当使用扩展缓存(即用 \Yiisoft\Cache\Cache 包装的 PSR-16 缓存)时,您可以使用更简洁的语法

$cache = new \Yiisoft\Cache\Cache(new \Yiisoft\Cache\ArrayCache());
$key = ['top-products', $count = 10];

$data = $cache->getOrSet($key, function (\Psr\SimpleCache\CacheInterface $cache) use ($count) {
    return getTopProductsFromDatabase($count);
}, 3600);

键的标准化使用 Yiisoft\Cache\CacheKeyNormalizer 进行。

为了删除值,您可以使用

$cache->remove($key);

您可以使用以下方式使用 PSR-16 方法,但请记住,单独获取和设置缓存违反了“可能过期”算法。

$value = $cache
    ->psr()
    ->get('myKey');

失效依赖

当使用 \Yiisoft\Cache\Cache 时,除了为 getOrSet() 方法指定 TTL 之外,还可以指定可能触发缓存失效的依赖项。以下是一个使用标签依赖项的示例

/**
 * @var callable $callable
 * @var \Yiisoft\Cache\CacheInterface $cache
 */

use Yiisoft\Cache\Dependency\TagDependency;

// Set multiple cache values marking both with a tag.
$cache->getOrSet('item_42_price', $callable, null, new TagDependency('item_42'));
$cache->getOrSet('item_42_total', $callable, 3600, new TagDependency('item_42'));

// Trigger invalidation by tag.
TagDependency::invalidate($cache, 'item_42');

其他依赖项

  • Yiisoft\Cache\Dependency\CallbackDependency - 当回调结果更改时使缓存失效。
  • Yiisoft\Cache\Dependency\FileDependency - 根据文件修改时间使缓存失效。
  • Yiisoft\Cache\Dependency\ValueDependency - 当指定值更改时使缓存失效。

您可以使用 Yiisoft\Cache\Dependency\AnyDependencyYiisoft\Cache\Dependency\AllDependencies 组合多个依赖项。

要实现自己的依赖项,请从 Yiisoft\Cache\Dependency\Dependency 扩展。

缓存雪崩防止

缓存雪崩是指在高负载下,具有缓存机制的并行计算系统可能出现的一种级联故障。这种行为有时也被称为狗熊式攻击。\Yiisoft\Cache\Cache 使用一个内置的“可能过早过期”算法,以防止缓存雪崩。此算法在为其他用户仍提供缓存值的同时,随机模拟一个用户的缓存未命中。您可以通过 getOrSet() 的第五个可选参数来控制其行为,该参数是一个名为 $beta 的浮点值。默认情况下,beta 的值为 1.0,在大多数情况下已足够。值越高,缓存重新创建得越早。

/**
 * @var mixed $key
 * @var callable $callable
 * @var \DateInterval $ttl
 * @var \Yiisoft\Cache\CacheInterface $cache
 * @var \Yiisoft\Cache\Dependency\Dependency $dependency
 */

$beta = 2.0;
$cache->getOrSet($key, $callable, $ttl, $dependency, $beta);

缓存处理程序

以下处理器是指 PSR-16 的实现。

本软件包包含两个处理器

  • Yiisoft\Cache\ArrayCache - 只通过在数组中存储值来为当前请求提供缓存。
  • Yiisoft\Cache\NullCache - 不进行任何缓存,对所有方法调用都返回成功。

额外的缓存处理器作为单独的软件包实现

数据序列化

本软件包提供了用于数据序列化的 Yiisoft\Cache\Serializer\SerializerInterface。它可以在数据库、文件或 Redis 缓存实现中很有用。默认情况下,您可以使用 Yiisoft\Cache\Serializer\PhpSerializer,该插件通过 PHP 函数 serialize()unserialize() 工作。您可以创建自己的实现,例如

use Yiisoft\Cache\Serializer\SerializerInterface;

final class IgbinarySerializer implements SerializerInterface 
{
    public function serialize(mixed $value) : string
    {
        return igbinary_serialize($value);
    }

    public function unserialize(string $data) : mixed
    {
        return igbinary_unserialize($data);
    }
}

文档

如果您需要帮助或有疑问,Yii 论坛 是一个好去处。您还可以查看其他 Yii 社区资源

许可证

Yii 缓存库是自由软件。它根据 BSD 许可证发布。有关更多信息,请参阅 LICENSE

Yii 软件 维护。

支持项目

Open Collective

关注更新

Official website Twitter Telegram Facebook Slack