缓存

优质
小牛编辑
139浏览
2023-12-01

imi 中的缓存,符合PSR-16规范。使用时需要先配置驱动和实例。

配置

默认缓存设置

<?php
return [
    'cache'    =>    [
        'default'    =>    'alias1',
    ],
];

手动使用

写入缓存

// 永久有效
Imi\Cache\CacheManager::set('缓存名称', 'key', 'value');

$ttl = 3600; // 缓存有效时间,单位:秒
Imi\Cache\CacheManager::set('缓存名称', 'key', 'value', $ttl);

批量写入缓存

$values = [
    'k1'    =>    'v1',
    'k2'    =>    'v2',
];
Imi\Cache\CacheManager::setMultiple('缓存名称', $values);

$ttl = 3600; // 缓存有效时间,单位:秒
Imi\Cache\CacheManager::setMultiple('缓存名称', $values, $ttl);

读取缓存

Imi\Cache\CacheManager::get('缓存名称', 'key');

Imi\Cache\CacheManager::get('缓存名称', 'key', 'default');

批量读取缓存

$keys = ['k1', 'k2'];

Imi\Cache\CacheManager::getMultiple('缓存名称', $keys);

Imi\Cache\CacheManager::getMultiple('缓存名称', $keys, 'default');

删除缓存

Imi\Cache\CacheManager::delete('缓存名称', 'key');

批量删除缓存

$keys = ['k1', 'k2'];

Imi\Cache\CacheManager::deleteMultiple('缓存名称', $keys);

缓存是否存在

Imi\Cache\CacheManager::has('缓存名称', 'key');

清空缓存

Imi\Cache\CacheManager::clear('缓存名称');

注解使用

除了手动控制缓存读写,你还可以使用注解来做,真的炒鸡方便哦!

首先来认识一下 imi 中的缓存注解吧!

@Cacheable

调用方法前检测是否存在缓存,如果存在直接返回;不存在则执行方法体,然后将返回值存入缓存

用法:

基本用法:

@Cacheable(name="缓存器名,为null则取cache.default配置", key="缓存键名,支持{id}、{data.name}、{:args}(所有参数的hash值)形式,代入参数,如果为null,则使用类名+方法名+全部参数,序列化后hash", ttl="超时时间,单位秒", lockable="Lock 注解,在调用方法体前后加锁", hashMethod="md5")

防止缓存击穿:

/*
 * @Cacheable(
 *   key="index:{page}",
 *   ttl=10,
 *   lockable=@Lockable(
 *     id="index:{page}",
 *     waitTimeout=999999,
 *   ),
 *   preventBreakdown=true,
 * )
 */

lockable 用法请参考 Lock

preventBreakdown 如果设为 true,会在获得锁后,尝试获取缓存,如果缓存存在则不再执行方法体

如果 preventBreakdown 设为 true,并且lockable中也设定了afterLock,优先级为:afterLock > 缓存检测

@CacheEvict

缓存驱逐注解,方法体执行时,将指定缓存清除

用法:

在方法执行前删除缓存:

@CacheEvict(name="同上", key="同上", beforeInvocation=true, hashMethod="md5")

在方法执行后删除缓存:

@CacheEvict(name="同上", key="同上", hashMethod="md5")

@CachePut

方法体执行后,将返回值存入缓存

用法:

将方法返回值全部写入缓存:

@CachePut(name="同上", key="同上", ttl="同上", hashMethod="md5")

将方法返回值的一部分写入缓存:

@CachePut(name="同上", key="同上", ttl="同上", value="a.b", hashMethod="md5")

上面的注解,如果方法返回值为:

[
    'a' =>  [
        'b' =>  123,
    ],
]

则会将123写入缓存。